0

比方说,我有一个Partner模型,代表广告联盟中的附属合作伙伴。每个合作伙伴都与可以固定的佣金(绝对货币)或可变(百分比)相关联。 partners表使用列commission_type,commission_fixedcommission_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,这感觉很奇怪。

您认为如何?

+0

或者您可以从模型方法'{:type =>:commission_variable,:value => 0.20}'返回一个散列,并从视图中使用I18n。 – rubish

+0

这是不可能的,因为参数在实际实现中并不总是相同的(即对于某些佣金类型它是'value',但对于其他类型则是'range_min'和'range_max') –

回答

0

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