Ruby on rails 建议在哪里存储布局的实例变量

Ruby on rails 建议在哪里存储布局的实例变量,ruby-on-rails,ruby,Ruby On Rails,Ruby,如果您有一个从数据库获取菜单项的菜单中包含的布局。在Rails应用程序中,建议在何处放置该调用并将其分配给布局使用的实例变量 1. @menuitems # exists in application.html.erb 2. @menuitems = MenuItem.find(:all) # code exists somewhere (where should this exist?) @womble-是的,一个before_过滤器会很有帮助,但我必须将它包含在使用此布局的所有控制器中,或

如果您有一个从数据库获取菜单项的菜单中包含的布局。在Rails应用程序中,建议在何处放置该调用并将其分配给布局使用的实例变量

1. @menuitems # exists in application.html.erb
2. @menuitems = MenuItem.find(:all) # code exists somewhere (where should this exist?)

@womble-是的,一个before_过滤器会很有帮助,但我必须将它包含在使用此布局的所有控制器中,或者这是我可以放在应用程序_controller.rb中的东西,子控制器和附带的视图是否能够看到该实例变量?

Martin Fowler描述了在模板代码中直接调用active record函数Rails MVC结构的弱点之一。为了获得最佳实践,您应该在模型类中创建一个成员函数,并从模板(包括布局模板)调用该函数

  • 您想要的功能应该在应用程序/模型中的某个地方定义

这种调用应该存在于系统的控制器层中。由于这是一件需要在全球范围内进行的事情,我可能会把它放在过滤器之前的
,并且恨自己这样做。在Rails中获取布局所需的数据有点麻烦,无论您采用哪种方式。是的,您可以在应用程序控制器中将其定义并设置为
之前的过滤器。在筛选之前,所有控制器都将调用该函数。以这种方式设置全局实例变量并不少见

另一种方法是在应用程序控制器中使用记忆方法,并将其设置为辅助方法,类似于流行的
当前用户
方法。然后,实例变量将被memonization函数很好地包装起来。例如:

def menu_items
  @menu_items ||= MenuItem.all
end
helper_method :menu_items
现在只需从布局中调用
menu\u items
,而不是直接使用
@menu\u items


我想值得一提的是,将其放在应用程序控制器中有些不必要。如果您只打算在视图/布局中使用它,那么可以将其直接放在帮助器模块中,例如LayoutHelper。您需要在应用程序控制器中使用
helper:all
(或至少使用
helper:layout

这在某种程度上是个人偏好——您可能喜欢也可能不喜欢在助手中使用ActiveRecord呼叫。但是,如果有时间这样做的话,现在就是时候了