2012-02-26 19 views
0

コントローラを拡張せずにRailsモデルでオーナーシップ検証を行う最良の方法を探しています。つまり、私はcurrent_userを何とかモデルに渡す必要があります。私は完全にこの中User.current_userの寿命を理解している場合、私はわからないRailsモデルのクラス属性の寿命を理解する

class User < ActiveRecord::Base 
    cattr_accessor :current_user 
end 

class ApplicationController < ActionController::Base 
    before_filter :set_current_user 
    def set_current_user 
    User.current_user = current_user 
    end 
end 

は、私は現在、すべての要求の開始時にCURRENT_USERにUserモデルのクラス属性を設定していますシナリオ。リクエスト中に値が変更される可能性はありますか?

私は、主に上記の使用が安全かどうか、またより良いアプローチがあるかどうかを知りたいと思っています。

+0

あなたのアプリをマルチスレッドモードで実行するかどうかによって異なります –

答えて

2

あなたの質問の最初の部分に答えるために。 Userクラスがガーベジコレクタにフラッシュされる/送信されるまで、属性はメモリに保存されます。これは通常、VMまたはインタプリタがシャットダウンするときです。

Herokuのような環境では、この変数は要求の間に格納することができ、認証されていないユーザーは、最初のユーザーが終了したときにクリアされない限り、この変数にアクセスして最新のユーザーにアクセスできます。

+0

を除いて、認証されていないユーザーが訪問すると、それはゼロに設定されます。 – tybro0103

+0

私はまったく異なる問題を抱えていますこの問題。あなたはHerokuのリクエスト間でどのように変数がメモリに保持されているかを議論するリファレンスを提供できますか? –

1

ベストプラクティスに準拠させたい場合は、これは間違いなく正しいアプローチです。 current_userはコントローラメソッドであり、Chain-of-responsibilityパターンに従うことにより、Userモデルは現在のユーザーが誰であるかを知るべきではありません。

+1

これは面白いことですが、OP *は現在のユーザーが誰であるかを保存するようにユーザーモデルに指示しているからです。 –

+0

ありがとう...私はより多くの生涯を心配しています...要求の間に価値が変わる可能性はありますか? – tybro0103

+0

それは間違っています。あなたは、そうしてはならない場所に州を隠しています。リクエスト中に誰かが 'current_user'を変更したらどうなりますか?その後、2つのvarsが同期しなくなります。 – theodorton

0

これは安全な方法ではありません:)コントローラ内の状態とモデル内のビジネスロジックを維持してください。

モデル層にcurrent_userを渡す必要がある場合、モデルは誰であるか気にする必要はありません。コンテンツへのアクセスをフィルタリングするためには、常に関連付けを使用できます。

current_user.widgets.find(params[:id])

+0

私はあなたが間違っていると信じています。これは実際に状態を格納するためのものではありません。実際にはビジネスロジックのためです。これにより、更新時にモデル内の所有権をチェックすることができます。たとえば、Postモデルの検証では、次のようになります。self.user_id == User.current_user – tybro0103

+0

コントローラに入る必要があります。モデル自体ではなく、アクセスを制限します。これを行うには、コントローラの更新メソッドをリファクタリングして、has_many-associationでfindを使用します。 – theodorton

+0

私はこれがビジネスロジックと見なされるかどうかにかかわらず、これが宗教的なものだと知っていますが、私はそう信じています。私は、以下のようにPostでメソッドを作ることができます:def is_owner?(user)そしてそのメソッドをコントローラーで使用しますが、それはすべてのアクションでやるのが面倒です。 – tybro0103

関連する問題