views:

139

answers:

3

I've read about HMVC (Hierarchic Model View Controller) and it's flexible structure.

Have a look at this picture:

http://techportal.ibuildings.com/wp-content/uploads/2010/02/MVC-HMVC.png

I wonder if the Rails 3 plugins are the answer to HMVC in Rails 3?

EDIT: Why cant I start a bounty on this one? No bounty button, bug?

+1  A: 

Rails has had plugins for a long time.

I doubt there is a technical reason why a controller couldn't dispatch to another controller, passing the request object along a chain. I just don't know what you gain by doing so - the diagram looks like spaghetti.

To me it's a misuse of MVC. I would suggest it is much simpler and more maintainable to push logic into lower-level models and classes and create a single controller that fronts the this logic, rather than creating a chain of controllers.

Toby Hede
I dont agree here. Maybe i'm adding some new features that could be stand alone...then it's good to have it as a standalone MVC component rather than incorporating everything in the main application MVC, thus making it re-usable for other projects. Plus, everyone of those MVC components you see in the diagram could be from a 3rd party vendor. I wouldn't mix them inside my main application MVC. The diagram doesn't seem spaghetti to me, it seems to be very well structured. Delegate rather than throwing everything in one big chunk that will get bigger and bigger.
never_had_a_name
I think it's a leaky abstraction. What advantages does it bring that a well-structured object layer handling your business logic can't achieve in a more granular and easily tested fashion?
Toby Hede
And voting me down because I have serious and well-considered reservations about the architectural style is kinda harsh.
Toby Hede
@toby hede. Maybe it's not my job to test those 3rd party MVC components. They are like add-ons that I can add/delete to/from the application itself. I voted down for "The diagram looks like spaghetti" phrase. If you added "to me" I think it would sound better and I will up-vote you again :)
never_had_a_name
cause it sounded too harsh to the HMVC...but I forgive you:) the voting button is locked..you have to edit the answer a bit so i can upvote =)
never_had_a_name
+1  A: 

In the Rails 3 blog post, DHH mentioned the Cells project. I haven't used it but I am going to check it out.

The cart example shows well how that kind of functionality might clean up your application code. Code which retrieves data should be placed somewhere in controller. In every action or in a before filter. The Cell seems to be much better solution.

Greg Dan
+2  A: 

Based on the comments to Toby's answer it seems that you would like to be able to have MVC apps used as a component within a new app. Rails Engines (See http://rails-engines.org) provides this functionality. You simply install the engines gem and place apps in vendor/plugins and its modles/views/controller are all accessible.

This does not really conform to HMVC where the controllers in the new app delegate to other controllers. But like Toby I do not see the advantage of that.

What is nice about the Engines approach is that you can over ride any of models in the plugin by just adding a version of the model to the new apps app/model folder (same applies for views and controllers)

I have overidden app/views/layouts to give my Authentication app/plugin the same look and feel as the application it is included in.

For Rails 3 Railtie takes the place of engines and is officially supported (and actually used - Action Mailer is a Railtie plugin. I have not used it myself yet though.

Check it out at http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html

A nice write up on it is also here http://www.igvita.com/2010/08/04/rails-3-internals-railtie-creating-plugins/

Will
What are the differences/advantages of using Railties over Rails plugins?
never_had_a_name
A justification for Railtie can be found here http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/
Will
From the Railtie site "Developing a Rails extension does not require any implementation of Railtie, but if you need to interact with the Rails framework during or after boot, then Railtie is what you need to do that interaction."
Will