在rails上的ruby中实现标准的头文件导航

时间:2012-08-26 10:42:45

标签: ruby-on-rails ruby-on-rails-3

这更像是一个“如何接近它”的风格问题。但是,如果我在ROR中编写需要数据库查询的标题和导航,但在每个页面上都是相同的。我该如何设置变量?

到目前为止,我一直在每个控制器中重复请求,我看到一篇文章提到过滤器。但这是解决这个问题的最好方法吗?

基本上我要做的就是执行此代码来生成标题导航的类别:

 @top_categories = Category.roots

然后在视图中有一个名为_header的部分读取类别,这包含在默认布局中。

我希望所有页面都可以使用该变量,因为所有页面上的标题都相同,但对于Ruby我是新手,我不知道该怎么做。

感谢您的帮助。

4 个答案:

答案 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 -%>

当然使用前过滤器也很好。这两种解决方案本质上都不是“更好”,但我更喜欢让我的控制器尽可能干净。