目前我在观点上进行一些计算,当然这是一件坏事,
<% categories.each do |c| %> .... <%= c.transactions.sum("amount_cents") %> .... <% end %>
我正在研究有助于我重构上述问题的方法.
有一件事是将计算转移到我的控制器
@category_sum = @transaction.sum("amount_cents")
这可能是一个更好的解决方案,但你知道.不完美.
由于我有很多用户,我看不到如何将计算器逻辑移动到我的模型中.所以我想我可能需要使用一个新的类,创建一堆方法(sum,average等)并在视图中使用它们?我在正确的轨道上吗?将感谢任何关于如何重组我的代码和设计和实现这个类的建议.
解决方法
隔离视图逻辑的一个意思是使用演示者.
主持人可以让你做这样的事情:
<% 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
当然,如果您在演示者中有很多方法,那么最好使用(但一旦开始减少视图逻辑,则可以快速填充演示者).
这里使用的实现依赖于this pro railscast中所描述的内容.基本思想是简单地拥有一个#present帮助器,它基于对象类来推断一个类名,加载并初始化适当的演示者类.
另一个流行的选择是使用drapper,它使用装饰器的概念,但是演示者基本上是装饰器.