Hi, this is a design question I've setup a micro-cms for my About pages etc using a "pages" table containing name, title, body, parent_id, position, and the model is setup as both acts_as_tree and acts_as_list. The pages table has the page content, and also is used to define the menus for the tree. This is working, so far so good. Some of these pages might contain a list of items from another table, for example, Board of Directors, shown after the body text. One way I'm thinking to handle this is add fields to pages for sub-content model, method name, and partial, and have the pages controller call the method and pass the data along to the display_page template (which calls the partial) What do you think? An alternative would be to add a controller/action for the other content and just use the page as a placeholder so it still shows in the menu. And add a url field to the page model (or even separate controller, action fields), thats used in the menu link. linoj
on 2007-03-08 17:07
on 2007-03-09 04:16
hi, this is how I solved it: lets say I have one model, "page" with a list of pages, and another model "director" with a list of company directors. A page has a title, body, etc plus an optional field called "modelmethod", which expects a string in the format "Model|method| partial". On the page that should contain the list of directors I enter the string "Director|get_list|directors_list", meaning for the Director model, use the get_list method to get a collection, and display it with the _directors_list.rhtml partial. The Director model has a method: def self.get_list find(:all, :order => "position") end On the page controller, I parse the modelmethod string, call the method and pass the results (@data and @data_partial) to the view, as follows: unless @page.modelmethod.nil? data_model, data_method, @data_partial = @page.modelmethod.split(/\s*\|\s*/) unless data_model.nil? || data_method.nil? || @data_partial.nil? @data = Object.const_get(data_model).send(data_method) end end In the page view, i call the partial with the data <% unless @data.nil? %> <%= render :partial => @data_partial, :object => @data %> <% end %> And the partial template, named _directors_list.rhtml displays the list <% for director in directors_list %> etc Thus, now I can configure my "pages" through the admin gui to show content from other tables. Is this cool? or is it a bad idea for some reason(s)?