如果您有一个菜单中的布局,该菜单从数据库中获取其菜单项.Rails应用程序中建议放置该调用并将其分配给布局使用的实例变量的位置在哪里?
1. @menuitems # exists in application.html.erb 2. @menuitems = MenuItem.find(:all) # code exists somewhere (where should this exist?)
@womble - 是的,before_filter会有所帮助,但我必须将它包含在使用此布局的所有控制器中,或者这是我可以放在application_controller.rb中的内容,子控制器和附带的视图是否能够看到该实例变量?
是的,您可以before_filter
在应用程序控制器中定义和设置它.所有控制器都会在过滤之前调用它.以这种方式设置全局实例变量并不罕见.
另一种方法是在应用程序控制器中使用memoization方法,并将set作为辅助方法,与流行current_user
方法类似.然后,实例变量将由memoization函数很好地包装.例如:
def menu_items @menu_items ||= MenuItem.all end helper_method :menu_items
现在只需menu_items
从您的布局调用而不是@menu_items
直接使用.
我认为值得一提的是将它放在应用程序控制器中是不必要的.如果您只想在视图/布局中使用它,可以将它直接放在辅助模块中,例如LayoutHelper.您需要在应用程序控制器中使用helper :all
(或至少helper :layout
).
这有点个人偏好 - 您可能喜欢也可能不喜欢在助手中进行ActiveRecord呼叫.但是,如果有时间这样做,那就是它.