>想象一下,我有一个博客,我想要一个页脚或侧边栏,在任何给定时间显示我最近的 3 篇帖子。
最好的方法是什么?
我可以在每个控制器中调用@recent_posts
,让它们为布局做好准备,但这似乎不是最好的方法......完全。。。
@recent_posts = Posts.all(:limit => 3)
我一直在摆弄部分,但它们确实需要一个带有@recent_posts
的实例变量。
您可能关注两部分:1(性能,2(需要付出的努力。 两者都很容易解决。
正如 Andrei S 在他的回答中指出的那样,通过使用调用从 ApplicationController
类执行工作的方法的before_filter
,可以缓解便利/工作量问题。
性能问题只是稍微多做一点工作。 而不是方法
def most_recent_posts
Posts.order(created_at DESC).limit(3)
end
而是这样做
def most_recent_posts
@most_recent_posts ||= Posts.order(created_at DESC).limit(3)
end
它检查实例变量是否为 nil;如果为 nil,则执行查询并将结果分配给实例变量。
您还需要一种方法来更新添加新帖子,所以也许像
def clear_most_recent_posts!
@most_recent_posts = nil
end
然后只需从修改表的方法调用clear_most_recent_posts!
。before_filter
将仅在需要时执行其工作。
我相信一些更有说服力的红宝石学家有更好的方法来做到这一点,但这是一个想法。
您可以将帖子所在的部分放在部分,并在应用程序的总体布局中使用它。
要将它们全部加载到每个控制器中,您可以在ApplicationController
中设置实例变量before_filter
,该变量将在布局中呈现的部分中可用
这样你只需要做一次,它会在任何地方完成(当然,你可以在过滤器和布局上设置条件,在需要时加载它们,也就是说,如果你并不真的需要它们在每个页面上