模型或帮助器中模型属性的动态转换?

时间:2011-08-19 14:41:50

标签: ruby-on-rails ruby-on-rails-3 model-view-controller internationalization

假设我有一个代表广告网络中的联属合作伙伴的Partner模型。每个合作伙伴都与一个可以固定(绝对货币)或可变(百分比)的佣金相关联。 partners表格使用commission_typecommission_fixedcommission_variable列对此进行建模。这是一种简化,实际上有7种委托类型,因此单表继承或多个模型需要大量额外的代码。

在我看来,我想显示佣金,如下:

<div class="partner_commission"><%= partner.commission %></div>

(使用模型方法)

<div class="partner_commission"><%= commission(partner) %></div>

(使用辅助方法)

现在,需要注意的一个重要方面是整个应用程序是多语言的,因此视图中的每个字符串都必须使用I18n.translate / I18n.t帮助程序进行翻译。翻译不仅包含数字/货币格式,因此需要为佣金字符串进行自定义翻译(更不用说为什么)。

该方法如下所示(简化模型版本):

def commission
  case self.commission_type
  when 'commission_fixed'
    t(:commission_fixed, :value => self.commission_fixed)
  when 'commission_variable'
    t(:commission_variable, :value => self.commission_variable)
  end
end

问题是:我应该在哪里实施commission方法以符合MVC理念,最佳实践等?

将其放入帮助的原因是它只涉及视图中佣金数据的呈现,而不是数据本身。另一方面,必须实现一个辅助方法,它只涉及单个模型,但在许多视图中使用,这感觉不对。

将其放入模型的原因是佣金字符串可以被视为派生属性,因此应该在模型中定义。另一方面,我必须手动包含i18n视图助手才能在模型中使用I18n.translate,这感觉很奇怪。

您怎么看?

1 个答案:

答案 0 :(得分:0)

我会说它应该进入模型。模型应该控制您的数据,这正是您希望佣金方法所做的。在MVC中完全可以使用模型方法来组合/修改数据,以便以良好的形式返回数据。