我有一個定義了兩個動作的軌道控制器:index
和show
。 我有一個在index
操作中定義的實例變量。該代碼是類似下面的東西:控制器所有動作的實例變量相同
def index
@some_instance_variable = foo
end
def show
# some code
end
我如何可以訪問@some_instance_variable
在show.html.erb
模板?
我有一個定義了兩個動作的軌道控制器:index
和show
。 我有一個在index
操作中定義的實例變量。該代碼是類似下面的東西:控制器所有動作的實例變量相同
def index
@some_instance_variable = foo
end
def show
# some code
end
我如何可以訪問@some_instance_variable
在show.html.erb
模板?
除非您正在從index
動作渲染show.html.erb
,否則您還需要在show動作中設置@some_instance_variable
。調用控制器操作時,它會調用匹配方法 - 因此在使用show
操作時將不會調用index
方法的內容。
如果需要@some_instance_variable
設置爲同樣的事情在index
和show
行動都,正確的方法是定義的另一種方法,雙方index
和show
調用,用於設置實例變量。
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
使得set_up_instance_variable
方法私人防止它被稱爲一個控制器動作,如果你有通配符路由(即match ':controller(/:action(/:id(.:format)))'
)
您可以通過過濾器之前使用定義多個操作實例變量,例如:
class FooController < ApplicationController
before_filter :common_content, :only => [:index, :show]
def common_content
@some_instance_variable = :foo
end
end
現在@some_instance_variable
會從index
或show
行動渲染的所有模板(包括諧音)訪問。
謝謝@Emily。但是有沒有幹這種做法? – Red 2016-02-12 07:58:15
謝謝@埃米爾我正在尋找同樣的東西。乾杯! – Aashish 2017-04-24 09:27:20
只需將'before_action:set_up_instance_variable,僅:[:show,:index]'添加到控制器。這將在您指定的任何操作之前運行'set_up_instance_variable'。 – domi91c 2017-07-20 20:16:16