我到處看到業務邏輯屬於模型,而不是控制器,但限制在哪裏? 我正在玩個人會計應用程序。爲了瘦身控制器的緣故,rails模型應該與其他模型有關嗎?
Account
Entry
Operation
在創建操作如果創建相應的條目和鏈接到帳戶,這樣的操作對於爲例平衡它是唯一有效的買了6包:
o=Operation.new({:description=>"b33r", :user=>current_user, :date=>"2008/09/15"})
o.entries.build({:account_id=>1, :amount=>15})
o.valid? #=>false
o.entries.build({:account_id=>2, :amount=>-15})
o.valid? #=>true
現在所示的形式在的情況下給用戶的基本操作被簡化爲隱藏條目的詳細信息,帳戶從默認的5種用戶所要求的操作中選擇(初始賬戶 - >權益對賬,花費資產 - >費用,賺取收入→資產,借貸負債→資產,支付債務資產→負債...)我想要從默認值創建的條目。
我也希望能夠創建更復雜的操作(超過2個條目)。對於第二個用例,我將使用另一種形式來顯示額外的複雜性。第二個用例阻止我在操作中包含借記和貸記字段並刪除Entry鏈接。
這是最好的形式?在操作類的SimpleOperationController使用上面的代碼,因爲我做的那一刻,或定義一個新的方法,所以我可以調用Operation.new_simple_operation(PARAMS [:操作])
是不是應該打破的關注點分離從Operation類實際創建和操作Entry對象?
我不是在尋找的建議對我的扭曲會計準則:)
編輯 - 我似乎沒有表達自己太清楚。 我不太關心驗證。我更關心創建邏輯代碼的位置:
假設控制器上的操作被稱爲花費,當使用支出時,參數散列將包含:金額,日期,描述。借方和貸方帳戶將從被調用的行爲中派生出來,但是我必須創建所有對象。它會更好有
#error and transaction handling is left out for the sake of clarity
def spend
amount=params[:operation].delete(:amount)#remove non existent Operation attribute
op=Operation.new(params[:operation])
#select accounts in some way
...
#build entries
op.entries.build(...)
op.entries.build(...)
op.save
end
或創建上操作的方法,這將使上面的樣子
def spend
op=Operation.new_simple_operation(params)
op.save
end
這肯定會給薄得多的控制器和一個胖模型,但隨後的模型將創建並存儲其他模型的實例,這是我的問題所在。
我最初接受了你的答案,但它假定條目的參數是定義的,而不是這種情況。然後,我將不得不在控制器中創建正確的參數,這與創建對象相同:)但是,您的技巧將在其他地方有用,並在rails 2.2中進行修復,如果IRRC – Jean 2008-09-16 06:20:39