我正在尝试在网站的每个网页上发布随机推荐。
我开始使用像这样的应用程序助手:
module ApplicationHelper
def random_testimonial
@random_testimonial = Testimonial.find(:first, :offset => rand(Testimonial.count))
end
end
在我看来,我可以引用该方法,但它在每个引用上被调用,这是有道理的。
我想在每个页面视图上调用一次,从而暴露我可以在视图中使用的推荐对象。
我应该寻找什么呢?
答案 0 :(得分:50)
虽然这有效,但我当然知道这样做,但它违反了MVC的关注点分离。视图助手不应该包含控制器/模型类型逻辑,这样做。
您可以考虑将其重构为应用程序控制器。辅助器应该用于视图格式化和东西,而不是作为一个函数(这是我开始时一直想要做的。)
如果你回到你的Testimonail模型,可以做
def self.random
Testimonial.find(:first, :offset => rand(Testimonial.count))
end
然后在你的应用程序控制器中,你可以这样做:
def random_testimonial
@random_testimonial ||= Testimonial.random
end
并从before_filter
调用它这样做的好处是可以将数据库逻辑移回到它所属的模型中。
答案 1 :(得分:6)
如果我理解正确,您需要一个方法,每次在一个请求/响应周期中引用它时返回相同的对象。如果这是真的,你可以通过对你的帮助者进行微小改动来实现它:
def random_testimonial
@random_testimonial ||= Testimonial.find(:first, :offset => rand(Testimonial.count))
end
注意“|| =”部分。这是一个Ruby习语,它说:为@random_testimonial赋值,除非它已经有值。
希望能回答你的问题。