ベストプラクティスは、あなたのモデルはステートレスで持つことである、コントローラは状態を扱うようになりました。情報をモデルに取り入れる場合は、コントローラから渡す必要があります。ステートフルなデータを追加しようとしているので、ここで作成フックを使うのは正しい方法ではありません。これらのフックは実際にはステートレスな動作のためのものです。
あなたは、コントローラからで情報渡すことができます。あなた自身が権限コードをたくさん書い見つけた場合
class User
def create_foo(params)
Foo.new(params.merge! {:creator_id => self.id})
end
end
:
Foo.new(params[:foo].merge {:creator_id => current_user.id})
それとも、これらの操作を処理するために、ユーザーのメソッドを作成することができますがコントローラーでは、オプション2を使用します。これは、そのコードをモデルにリファクタリングすることができるからです。それ以外の場合、オプション1はよりクリーンです。
オマールは、自動化するのがやりにくいと指摘していますが、それでもやり遂げることはできます。ここでは、ユーザーにcreate_somethingインスタンスメソッドを使用して、一つの方法です:あなたはまた、施工上のuser_idsを必要とする、または新しいラップApplicationControllerに内部メソッドを作成するためのコンストラクタをオーバーライドすることができます
def method_missing(method_sym, *arguments, &block)
meth = method_sym.to_s
if meth[0..6] == "create_"
obj = meth[7..-1].classify.constantize.new(*arguments)
obj.creator_id = self.id
else
super
end
end
。
多分もっと上品なやり方がありますが、モデルコードの中から状態を読み取ろうとするのは間違いです。MVCのカプセル化が壊れてしまいます。私は明示的に、それを別の方法で渡すことを大いに好みます。
あなたは何を知っていますか、私はこれに向かって傾いていますが、副作用の解決策はちょっと...ああ... ...好きには効果的です。 –
スレッドセーフですか?はい。自動化された?そうではありません。問題は、すべてのモデルをcreator_id列で追跡する必要があることです。 updater_id列を追加したい場合はどうなりますか?ロジックをさらに管理する必要があります。また、私は場合によってはcreator_id属性をマージする必要があることを忘れてしまうでしょう。私の好きなことを追跡することが多すぎます。 –
いくつかの自動化機能を追加しましたが、これに対するより良い解決策の余地は間違いありません。 –