比方说,我有一个Partner
模型,代表广告联盟中的附属合作伙伴。每个合作伙伴都与可以固定的佣金(绝对货币)或可变(百分比)相关联。 partners
表使用列commission_type
,commission_fixed
和commission_variable
进行了建模。这是一种简化,实际上有7种佣金类型,因此单表继承或多种模式需要大量额外的代码。动态翻译模型或助手中的模型属性?
在我看来,我想显示的佣金,这样的:
<div class="partner_commission"><%= partner.commission %></div>
(使用模型法)
或
<div class="partner_commission"><%= commission(partner) %></div>
(使用helper方法)
现在,需要注意的一个重要方面是整个应用程序是多语言的,所以每个条g视图必须与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
,这感觉很奇怪。
您认为如何?
或者您可以从模型方法'{:type =>:commission_variable,:value => 0.20}'返回一个散列,并从视图中使用I18n。 – rubish
这是不可能的,因为参数在实际实现中并不总是相同的(即对于某些佣金类型它是'value',但对于其他类型则是'range_min'和'range_max') –