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中,使用模型方法合併/修改數據以便以良好的形式返回是完全可以的。