我的应用程序布局视图中有一些代码需要一个对象才能工作。该对象存在于某些控制器上,但不是全部。
起初我以为我可以在application_controller上使用after_filter来确保该对象存在。但这不起作用,因为after_filter仅在渲染视图后应用,并且显然也是anti-pattern。
确保对象始终存在的最佳方法是什么,而不必在已创建对象的控制器上创建对象。
答案 0 :(得分:1)
说你的变量是@foo。
application_helper.rb
def foo
@foo ||= generate_foo()
end
然后从任何视图,你只需通过foo调用你的对象而不是@foo。
答案 1 :(得分:0)
这可能也有它自己的缺陷但是就个人而言,我将在application_controller
中创建一个方法来返回实例。要使其在视图中可用,只需将方法传递给helper_method
即可。 helper_method
用于在视图,帮助器和控制器之间共享方法。
我主要通过身份验证来做到这一点。所以你我会有类似的东西;
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
helper_method :current_user # make current_user available in the views