我的应用程序布局视图中有一些代码需要对象存在才能工作。该对象存在于某些控制器上,但不是全部。
起初我以为我可以在 application_controller 上使用 after_filter 来确保对象存在。但这不起作用,因为 after_filter 仅在视图渲染后应用,而且它显然也是一种反模式。
什么是确保对象始终存在的最佳方法,而不是在已经创建对象的控制器上不必要地创建对象。
我的应用程序布局视图中有一些代码需要对象存在才能工作。该对象存在于某些控制器上,但不是全部。
起初我以为我可以在 application_controller 上使用 after_filter 来确保对象存在。但这不起作用,因为 after_filter 仅在视图渲染后应用,而且它显然也是一种反模式。
什么是确保对象始终存在的最佳方法,而不是在已经创建对象的控制器上不必要地创建对象。
假设您的变量是@foo。
application_helper.rb
def foo
@foo ||= generate_foo()
end
然后从任何角度来看,您只需通过 foo 而不是 @foo 调用您的对象。
这可能也有它自己的缺陷,但就个人而言,我将在我的方法中创建一个方法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