Ruby on Rails布局从Model中读取数据

时间:2011-02-12 21:15:05

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

我正在开发一个RoR应用程序,我正在编写博客组件。我计划有一个布局文件,它将显示博客组件中每个页面上数据库中的所有标签。我知道如何创建和使用除application.html.erb之外的其他布局文件,但我不知道如何从数据库中读取各种控制器中每个操作的标签列表。我不想在每个动作中创建适当的实例变量。有什么方法可以解决这个问题?

3 个答案:

答案 0 :(得分:16)

before_filter中使用application_controller创建实例变量:

before_filter :populate_tags

protected

def populate_tags
  @sidebar_tags = Tag.all
end

答案 1 :(得分:9)

我建议使用before_filter,但也要在memcached中缓存你的结果。如果您要在每个请求中执行此操作,最好执行以下操作:

class ApplicationController
  before_filter :fetch_tags

  protected

  def fetch_tags
    @tags = Rails.cache.fetch('tags', :expires_in => 10.minutes) do
      Tag.all
    end
  end
end

这将确保您的代码被缓存一段时间(例如10分钟),因此您只需每10分钟进行一次此查询,而不是每次请求。

然后,您可以在侧边栏中显示标记,例如,如果您的布局中显示了_sidebar partial,则可以执行以下操作。

#_sidebar.html.erb
render @tags

答案 2 :(得分:1)

在ApplicationController中定义一个私有方法,并使用before_filter将其加载到那里。由于所有控制器都继承自ApplicationController,因此它将在每个操作之前执行。

另一个想法是通过辅助方法加载它,但我更喜欢第一种解决方案。