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这不是查询模型的状态。它正在基于某些业务逻辑创建模型的新实例。事实上,在原始代码中,视图正在确定模型的状态。