1

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

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

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

 @top_categories = Category.roots

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

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

谢谢你的帮助。

4

4 回答 4

1

你可以在你的 applicaion_controller.rb 或 application_helper.rb 中创建一个辅助方法。您可以从任何地方访问 application_controller 中的方法(我认为 ;) )。

如果你有像数组这样的静态内容,你可以将它存储在 application.rb 中,或者将它放在 config/initializers 文件夹中的一个额外的 rb 文件中。

于 2012-08-26T10:52:32.760 回答
0

我认为在这种情况下使用before_filteinApplicationController是最好的方法。DRY

这样,在向任何控制器发出任何请求之前,将触发此方法,您将在其中加载您编写的类别。

于 2012-08-26T10:49:57.717 回答
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 列表。

于 2012-08-26T10:50:31.757 回答
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 -%>

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

于 2012-08-26T14:28:51.607 回答