这更像是一个“如何接近它”的风格问题。但是,如果我在ROR中编写需要数据库查询的标题和导航,但在每个页面上都是相同的。我该如何设置变量?
到目前为止,我一直在每个控制器中重复请求,我看到一篇文章提到过滤器。但这是解决这个问题的最好方法吗?
基本上我要做的就是执行此代码来生成标题导航的类别:
@top_categories = Category.roots
然后在视图中有一个名为_header的部分读取类别,这包含在默认布局中。
我希望所有页面都可以使用该变量,因为所有页面上的标题都相同,但对于Ruby我是新手,我不知道该怎么做。
感谢您的帮助。
答案 0 :(得分:1)
您可以在applicaion_controller.rb或application_helper.rb中创建一个帮助方法。 您可以从任何地方访问application_controller中的方法(我认为;))。
如果您有静态内容,如数组或其他东西,您可以将其存储在application.rb中,或将其放在config / initializers文件夹中的额外rb文件中。
答案 1 :(得分:0)
我认为在before_filte
中使用ApplicationController
是这种情况下最好的DRY
方法。
通过这种方式,在向任何控制器发出任何请求之前,将触发此方法,您将在其中加载已编写的类别。
答案 2 :(得分:0)
如果我理解您的问题,您的类别不会发生太大变化。 您可以将所有类别加载到全局哈希并在应用程序中使用它。
将这样的代码放在ApplicationController
中 before_filter :fill_categories
def fill_categories
if $CATEGORIES.blank?
for category in Category.roots
$CATEGORIES[category.category_id] = category
end
end
end
因此,您可以使用$ CATEGORIES列表考虑您的应用程序。
答案 3 :(得分:0)
我建议使用帮助器(在application_helper.rb
中)。您只需在辅助方法中调用Category.roots
,就不需要使用回调来控制控制器。
一个例子..
class ApplicationHelper
def nav_header
Category.roots.map |category|
content_tag( :div, category.name, :class => 'category_link' )
end.join
end
end
当然,虽然在这种情况下你不想在视图中使用复杂的逻辑,但是查询很简单,你可以将它包含在部分中,你没有有来预加载所有内容:
<% Category.roots.each |category| -%>
<%= link_to category.name, category %>
<% end -%>
当然使用前过滤器也很好。这两种解决方案本质上都不是“更好”,但我更喜欢让我的控制器尽可能干净。