2012-01-20 13 views
4

CURRENT_USERフォームレールの3人のオブザーバーを得ることについてStackOverflowの上のいくつかの類似した質問が、基本的な考え方は同じである:Railsの3人のオブザーバーとCURRENT_USER

1)モデルの

attr_accessor :current_user 

経由CURRENT_USERの通過私たちは観察する必要があります。

しかし、私は10個のモデル(作成、更新、削除アクション)を観察する必要があるので、これは私にとっては受け入れられないもので、コントローラごとにこれを各アクションに渡したくありません。

2)現在のユーザーをスレッドに格納しています。完全に容認できない。

だからベストプラクティスは何ですか?そして、私はオブザーバーのcurrent_userだけでなく、IPアドレスも取得したいと考えていますか?

アイデア?

+2

これは多かれ少なかれ悩まされているので、実際にはややこしいことになってしまい、最終的には非常に優雅に感じることはほとんどありません。 (複数の)理由の1つは、例えば、あなたのレールプログラムにデータをインポートする必要があると言うことです。これはあなたのモデルとそれぞれのオブザーバーにアクセスする必要がありますが、コマンドラインから作業する場合は現在のユーザーはいません。今では、アプリケーションをWebサーバーの背後でしか動作させないように制限しています。そのため、大量のデータをインポートするようなものは痛いほど速くなります。 あなたのコードを貼り付けると、あなたのコメントをお寄せいただきありがとうございます。 – spotman

+0

@spotman基本的には、あまり一般的ではないので、私のコードはあまり役に立たないでしょう。他のユーザーが管理できるuser_idを持つ 'Item'(例として)のような10個のモデル。この方法でID 1のユーザーは、Itme.first.user_id(#=> 2)を編集できます。そして、私はオブザーバーが(User1によって更新されたItem1がUser2によって作成された)ようなものを観察する必要があります。そして、はい、Webサーバーによる制限は完全に私にとっては大丈夫です。 –

+0

このデータで何をしたいですか?あなたが更新を行った人に電子メールを送るようなことをしようとしているなら、コントローラに入れておくと、特に、attr_accessorを使ってupdater_idのようなものを設定したくない場合には、オブザーバーで読む。 – spotman

答えて

1

このようなタスクでRailsネイティブオブザーバを使用することは全く役に立たないことがわかりました。コントローラから何かを渡す必要がある場合は、私の場合それはcurrent_user、これは完全に遺跡の美しさを台無しにします。

私の自身の質問への私の答えは:acts_as_audited

0

last_modification_byフィールドをモデルに追加することをお勧めします。あなたの観察者は、それを使って誰が変更を行ったのか、誰が通知を受けるのかを知ることができます。

次に、ビュー/コントローラコードで現在のユーザーをそのフィールドに置きます。

これは私にとって最も安全なアプローチだと思われます。私は現在のユーザーを使用しているオブザーバーについて心配しています。現在のユーザーは、オブザーバーが行っている準バックグラウンド処理と離婚する必要があります。 (私はこれまで大きな成功を収めていたスレッドの中で現在のユーザーを隠しているのはなぜですか?)

last_modified_byを使用すると、レコードを一括して変更することができます。「おそらく(毎日の処理ルーチンが発生したため)レコードが更新されたという電子メールが送信されます。last_modified_by some createdシステム(または管理ユーザ)を表すユーザ

関連する問題