STI, controllers and views

Ryan Glover wrote:

Hello,

I have set up that uses single table inheritance. I have a number of model subclasses following the example in AWDWR that uses Manager < Employee < Person.

First question. Do I need to create controller classes for each? I don't think I do because a single controller should be able to shunt the data between the models and the views.

Second question. Say I have a view that shows a list of all people in the db. It shows first name, last name, and a 'show' link to view that persons details. For each type I would like to show a specific view, i.e. the manager_view, the employee_view etc. If I have a single controller with a show action and I pass it the person as a parameter how do I get the controller to show the correct view?

Thank you, Ryan Glover

First question: no, not necessary to have separate controllers. Using some convention of config naming (see below) it should work out nicely using the fact that @someinstance.class will return the STI subclass and @someinstance.class.base_class will return the, er, base class

Second question: You can do something in your controller like: def show     @item = Person.find(params[:id]) # where Person is your base class     render :template => "/people/#{@item.class.base_class}_view" # assuming the controller is called people and the templates employee_view, manager_view end

Alternatively if there's a lot of common stuff in the show templates, just have one show template and use partials in the view to show the bit that's unique to the STI subclasses.

HTH

Chris