我正在开发一个RoR应用程序,我正在编写博客组件。我计划有一个布局文件,它将显示博客组件中每个页面上数据库中的所有标签。我知道如何创建和使用除application.html.erb之外的其他布局文件,但我不知道如何从数据库中读取各种控制器中每个操作的标签列表。我不想在每个动作中创建适当的实例变量。有什么方法可以解决这个问题?
答案 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,因此它将在每个操作之前执行。
另一个想法是通过辅助方法加载它,但我更喜欢第一种解决方案。