What is the best way to reuse a controller's action and views?

What is the best way to reuse a controller's actions and views?

Lets say I have an application that has controller: SampleController<ApplicationController

This controller would be accessable from the following url http:localhost:3000/sample/blah_action

I need to create another controller that has the actions of this controller, plus some more actions of its own

If I created another controller: ImageController < SampleController

Then this url : http://localhost:3000/sample/image/blah_action would take me to the ImageController if the actions exist exists in it. however if the action doesn't exist, it should use the parent's actions and views.

What is the best way to do this?

Thanks

I'd extract the common actions in a module and include it in both controllers.

But I need the views associated with that action also. how would you include the views?

Are there any way to do this more cleanly through controller inheritance?

I am confused, you pretty much seemed to answer your own question. There is no reason you can't just use controller inheritance:

class ParentsController < AC::Base   def show     # code here     respond_to do |format|       format.html { render :template => 'parent/show' }     end   end end

and then make /views/parents/show.html.erb

and then to extend:

class ChildrensController < ParentsController

end

Hi,

I has the same issue when I wanted a SOAP controller (ActionWebService) to reuse my Restful logic in the normal controllers. Inheritance was not an option, because i needed logic from mulitple Restful controllers (mixin would override shared method names, so that didn't work). I ended up using a render_component statement (with response format XML) from the SOAP Controller towards the Restful controller, which is really ugly because that means I was actually pretending the SOAP controller to be an external application. But it works fine en it helps me keep my code DRY (but slower).

If anybody has a better idea to solve this please let me know.

Regards, Bas

Check out RailsEngines: http://rails-engines.org/introduction

Have to agree on the RailsEngines.

If your views are non-changing then you may consider a combination of:

  • generator script to generate views and controllers

  • the controllers are actually ‘dumb’ ones that simply include a module(s)

  • the module(s) are in the plugin, including the Rails generators