2009-02-15 49 views
3

如果您有一个布局在菜单中获取其数据库中的菜单项。 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,将孩子控制器和随附视图能够看到该实例变量?

回答

8

是的,你可以定义并将其设置为你的应用程序控制器before_filter。所有的控制器都会在过滤之前调用它。以这种方式设置全局实例变量并不罕见。

另一种方法是在应用程序控制器中使用memoization方法,并将其设置为辅助方法,方法与流行的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的在你的助手调用。但是,如果有时间这样做,就是这样。

0

Martin Fowler的描述了模板代码Rails的MVC结构的薄弱环节中的一个中活动记录功能直接调用。为了获得最佳实践,您应该在模型类中创建一个成员函数,并从您的模板(包括布局模板)调用该函数。

  • 你想应该应用某处定义的函数/模型
0

那种来电的,应在系统的控制层存在。由于它看起来需要在全球范围内发生,我可能会把它放在before_filter之内,并且恨我自己这么做。获取布局所需的数据在Rails中有点难以理解,无论采用哪种方式。