I have a rails controller with two actions defined: index and show.
I have an instance variable defined in index action. The code is something like below:
def index
@some_instance_variable = foo
end
def show
# some code
end
How can I access the @some_instance_variable in show.html.erb template?
Unless you're rendering show.html.erb from the index action, you'll need to set @some_instance_variable in the show action as well. When a controller action is invoked, it calls the matching method -- so the contents of your index method will not be called when using the show action.
If you need @some_instance_variable set to the same thing in both the index and show actions, the correct way would be to define another method, called by both index and show, that sets the instance variable.
def index
set_up_instance_variable
end
def show
set_up_instance_variable
end
private
def set_up_instance_variable
@some_instance_variable = foo
end
Making the set_up_instance_variable method private prevents it from being called as a controller action if you have wildcard routes (i.e., match ':controller(/:action(/:id(.:format)))')
You can define instance variables for multiple actions by using a before filter, e.g.:
class FooController < ApplicationController
before_filter :common_content, :only => [:index, :show]
def common_content
@some_instance_variable = :foo
end
end
Now @some_instance_variable will be accessible from all templates (including partials) rendered from the index or show actions.
来源:https://stackoverflow.com/questions/9330486/same-instance-variable-for-all-actions-of-a-controller