Creating objects in application.rb

I'm trying to generate a simple navigation pane to include in my application.rhtml. The nav pane consists of dynamic link_to tags that are generated from data in a model.

I'm now used to doing trivial MVC operations in a template:

    def index         @departments = Department.find(:all)     end        <!-- view (cheesy example) --> <% @departments.each { |d|     <%= d.name +"<br>" %>     <% } %>

But what if I want to generate the @departments in application.rb? I have no action to place it in (like index), and it does not seem to work at the class level:

class ApplicationController < ActionController::Base     @departments = Department.find(:all) end

Should this work and be available in application.rhtml as @departments? If so then thats good news and my syntax is just wrong.

if not, is there an alternative way to populate an object in application.rb and use it in application.rhtml?

Thx Gary "still a newb" H.

I'm trying to generate a simple navigation pane to include in my application.rhtml. The nav pane consists of dynamic link_to tags that are generated from data in a model.

I'm now used to doing trivial MVC operations in a template:

   def index        @departments = Department.find(:all)    end

   <!-- view (cheesy example) -->    <% @departments.each { |d|    <%= d.name +"<br>" %>    <% } %>

But what if I want to generate the @departments in application.rb? I have no action to place it in (like index), and it does not seem to work at the class level:

class ApplicationController < ActionController::Base    @departments = Department.find(:all) end

Should this work and be available in application.rhtml as @departments? If so then thats good news and my syntax is just wrong.

if not, is there an alternative way to populate an object in application.rb and use it in application.rhtml?

Well, if you want to generate that every time you could do this:

class ApplicationController < ActionController::Base    before_filter :load_departments

   def load_departments      @departments = Department.find(:all)    end end

Or if you only want to load it once per application startup, do something similar in environment.rb and load it up as a constant or some such...

I'm trying to generate a simple navigation pane to include in my application.rhtml. The nav pane consists of dynamic link_to tags that are generated from data in a model.

I'm now used to doing trivial MVC operations in a template:

    def index         @departments = Department.find(:all)     end

    <!-- view (cheesy example) -->     <% @departments.each { |d|     <%= d.name +"<br>" %>     <% } %>

But what if I want to generate the @departments in application.rb? I have no action to place it in (like index), and it does not seem to work at the class level:

class ApplicationController < ActionController::Base     @departments = Department.find(:all) end

Should this work and be available in application.rhtml as @departments? If so then thats good news and my syntax is just wrong.

This would only run when the controller class is first loaded, which is probably not what you want. It's also an instance variable of the *class* and not of the *request*, so you can't access it from the view in the same way.

if not, is there an alternative way to populate an object in application.rb and use it in application.rhtml?

The MVC police might arrest me, but I see no problem with just putting the find directly in the view in this case. If the find became elaborate, I would refactor the complexity back into a model class method (much easier to test, and keeps the view code as simple as possible).

I don't like the before_filter approach. It would unecessarily retrieve the departments even if you weren't rendering the view (e.g. an xhr response or a post-redirect), it pollutes the request namespace, and it prevents optimization through fragment caching.