当前,我正在视图中执行一些计算,这当然是一件坏事:
<% categories.each do |c| %>
....
<%= c.transactions.sum("amount_cents") %>
....
<% end %>
我正在研究可以帮助我重构上述问题的方法。
一件事是将计算移至我的控制器
@category_sum = @transaction.sum("amount_cents")
这可能是一个更好的解决方案,但您知道。不完美。
由于我有很多用户,因此我看不到如何将计算器逻辑移到我的模型中。所以我想我可能需要使用一个新的Class,创建一堆方法(求和,平均值等)并在视图中使用它们?我在正确的轨道上吗?感谢您提供有关如何重组我的代码以及设计和实现此类的建议。
隔离视图逻辑的一种方法是使用演示者。
演示者可以让您执行以下操作:
<% categories.each do |c| %>
....
<% present c do |category| %>
<%= category.transaction_sum %>
<% end %>
....
<% end %>
然后,您在中有一个演讲者班级app/presenters/category_presenter.rb
:
class CategoryPresenter < BasePresenter
presents :category
def transaction_sum
category.transactions.sum("amount_cents")
end
end
当然,如果演示者中有很多方法,最好使用它(但是一旦您开始减少视图逻辑,就可以很快地填充演示者)。
这里使用的实现依赖于此prorailscast中描述的内容。基本思想只是拥有一个#present
帮助程序,该帮助程序根据对象类推断类名,加载并初始化适当的presenter类。
另一种流行的替代方法是使用drapper,它使用装饰器的概念,但是演示者基本上是装饰器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句