ビジネスロジックがコントローラーではなくモデルに属していることをどこでも読みましたが、制限はどこにありますか? 私は個人会計アプリケーションをいじっています。
Account
Entry
Operation
操作を作成するとき、対応するエントリが作成され、アカウントにリンクされている場合にのみ有効です。
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 つ以上のエントリ) を作成できるようにしたいと考えています。この 2 番目のユース ケースでは、追加の複雑さが明らかになる別のフォームを使用します。
最適なフォームはどれですか? 今のところ、SimpleOperationController で上記のコードを使用するか、Operation クラスで新しいメソッドを定義して、Operation.new_simple_operation(params[:operation]) を呼び出せるようにします。
Operation クラスから Entry オブジェクトを実際に作成して操作することは、関心の分離を壊していませんか?
私は自分のねじれた会計原則についてアドバイスを求めているわけではありません :)
編集 - 私は自分自身をはっきりと表現していないようです。検証についてはあまり気にしていません。私は、作成ロジックコードがどこに行くべきかについてもっと心配しています:
コントローラーでの操作がspendと呼ばれると仮定すると、spendを使用する場合、paramsハッシュには金額、日付、説明が含まれます。借方勘定と貸方勘定は、呼び出されたアクションから派生しますが、その後、すべてのオブジェクトを作成する必要があります。あったほうがいいでしょうか
#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
または、上記を次のようにする Operation のメソッドを作成します
def spend
op=Operation.new_simple_operation(params)
op.save
end
これは間違いなく、はるかに薄いコントローラーとより太いモデルを提供しますが、モデルは他のモデルのインスタンスを作成して保存します。これが私の問題です。