目前我正在按照我的观点进行一些计算,这当然是一件坏事:
<% categories.each do |c| %>
....
<%= c.transactions.sum("amount_cents") %>
....
<% end %>
我正在研究可以帮助我重构上述问题的方法。
一件事是将计算移至我的控制器
@category_sum = @transaction.sum("amount_cents")
这可能是更好的解决方案,但你知道。不完美。
由于我有很多用户,我不知道如何将计算器逻辑移动到我的模型中。所以我想我可能需要使用一个新的类,创建一堆方法(总和,平均值等)并在视图中使用它们?我走在正确的轨道上吗?对于有关如何重组我的代码以及设计和实现此类的任何建议,我将不胜感激。
隔离视图逻辑的一种方法是使用演示者。
演示者允许您执行类似的操作:
<% 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
当然,如果演示器中有很多方法,那么最好使用它(但是一旦开始减少视图逻辑,演示器很快就会被填满)。
这里使用的实现依赖于中描述的内容这个专业 Railscast http://railscasts.com/episodes/287-presenters-from-scratch?view=comments。基本思想是简单地有一个#present
根据对象类推断类名的帮助器,加载并初始化正确的演示者类。
另一种流行的替代方法是使用drapper https://github.com/drapergem/draper,它使用装饰器的概念,但演示者基本上是一个装饰器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)