Ruby on rails 如何在RubyonRails中使用应用程序助手

Ruby on rails 如何在RubyonRails中使用应用程序助手,ruby-on-rails,Ruby On Rails,我试图在网站的每一页上随机发布一篇推荐信 我首先使用了一个应用程序助手,如下所示: module ApplicationHelper def random_testimonial @random_testimonial = Testimonial.find(:first, :offset => rand(Testimonial.count)) end end 在我看来,我可以引用这个方法,但是每次引用都会调用它,这很有意义 我希望在每个页面视图上调用一次,以显示我可以

我试图在网站的每一页上随机发布一篇推荐信

我首先使用了一个应用程序助手,如下所示:

module ApplicationHelper

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

end
在我看来,我可以引用这个方法,但是每次引用都会调用它,这很有意义

我希望在每个页面视图上调用一次,以显示我可以在视图中使用的证明对象


我应该寻找什么来实现这一点呢?

如果我理解正确,您需要一个方法,该方法在一个请求/响应周期中每次引用同一对象时都返回该对象。如果这是真的,则只需对助手做一点小改动即可实现:

 def random_testimonial
    @random_testimonial ||= Testimonial.find(:first, :offset => rand(Testimonial.count))
 end
请注意“| |=”部分。这是一个Ruby的习惯用法,它说:给@random_commential赋值,除非它已经有了值


希望这能回答您的问题。

虽然这样做有效,而且我也知道我会这样做,但它违反了MVC关注点分离。视图帮助程序不应该包含控制器/模型类型逻辑,而实际上是这样

您可以考虑将此重构为应用程序控制器。助手应该用于查看格式和其他内容,而不是作为一个函数(这是我刚开始时一直想做的)

如果你回到你的睾丸模型,你能做什么

def self.random
  Testimonial.find(:first, :offset => rand(Testimonial.count))
end
然后在应用程序控制器中,您可以执行以下操作:

def random_testimonial
  @random_testimonial ||= Testimonial.random
end
从一个before_过滤器调用它


这样做的好处是将数据库逻辑移回它所属的模型。

同意。斯科特,投票赞成你的解决方案。克里斯,我建议你选择斯科特的答案作为正确答案。我太专注于缓存变量的问题,而忽略了设计中的这个明显缺陷。我知道这确实很旧,但这是不正确的。MVC中的视图可以查询模型,但不能对其进行操作。因此,视图助手可以独立于控制器查询模型状态。@孙武功实际上这篇文章是正确的。Rails视图助手常常成为过程性业务逻辑的垃圾场。这里的重点是SOC。视图不应该实例化模型,也不应该包含模型行为。@azriel-我不建议这样做。如前所述,视图助手的角色是格式化,但MVC中的V允许“观察”模型,因此可以对模型进行查询(而不是更新)以实现这一点。人们认为C是M和C之间的栅栏V@sunwukung这不是查询模型的状态。它正在基于某些业务逻辑创建模型的新实例。事实上,在原始代码中,视图正在确定模型的状态。