如何在Ruby on Rails中使用Application Helpers

时间:2009-01-25 03:32:03

标签: ruby-on-rails

我正在尝试在网站的每个网页上发布随机推荐。

我开始使用像这样的应用程序助手:

module ApplicationHelper

  def random_testimonial
    @random_testimonial = Testimonial.find(:first, :offset => rand(Testimonial.count))
  end

end

在我看来,我可以引用该方法,但它在每个引用上被调用,这是有道理的。

我想在每个页面视图上调用一次,从而暴露我可以在视图中使用的推荐对象。

我应该寻找什么呢?

2 个答案:

答案 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赋值,除非它已经有值。

希望能回答你的问题。