2

RailsWardenプラグインを使用しています。現在のユーザーを返すヘルパーメソッド「user」を定義します。ソースコードのリンクを参照してください。

これで、コントローラーへの参照がないビジネスロジックオブジェクトができました。しかし、私は現在のユーザーを取得したいと思います。これにアクセスする方法はありますか?

私が試してみました

ActionController::Base.helpers.user

あるいは

RailsWarden::Mixins::HelperMethods.user

運がない。ありがとう。

4

2 に答える 2

2

これで、コントローラーへの参照を持たないビジネス ロジック オブジェクトができました。しかし、現在のユーザーを取得したいと思います。これにアクセスする方法はありますか?

では、現在のユーザーをこれらのメソッドに渡すことができないのはなぜでしょうか?

さらに、それらを混在させることができます。

静的ヘルパーを作成することは強くお勧めしません (これは Java ではなく、Ruby です!)。代わりに、これらのヘルパーが必要な場所にモジュールとして含めます。

module SuperLogic
 def calculate_stuff(current_user=nil)
  (current_user || user || self).bills.sum
 end
edn

次に、必要な場所にこれを含めます。

# user model
class User
  include SuperLogic
  #it will get the `calculate_stuff` method
end

# controller
include SuperLogic
# so you can use it as one of
calculate_stuff user
calculate_stuff

等々...

さらに、ビジネスロジックにアクセスする場所では、「静的」メソッドの代わりにクラスのインスタンスを作成できます(ルビーでは「クラス」メソッドです):

# controller
def calculate
  @result = BusinessLogic.new(user).calculate_stuff
end

これはおそらくあなたができる最も簡単なことです。

実際、ビジネス オブジェクトの HTTP コンテキスト全体にアクセスする必要はありません (テストについて話しているわけではありません)。

于 2011-04-01T04:32:19.587 に答える
0

私が考えるビジネス ロジックは、コントローラーとモデルの間にあるものです。リクエストのインスタンスをロジック メソッドに渡しても問題ないと思います。warden を使用しているので、request.env['warden'].user' からユーザーを取得できます。

論理メソッドをモジュールの静的 (自己) メソッドにしない正当な理由に遭遇したことはありません。Dmytrii の提案はうまくいくかもしれませんが、私は 1 回限りのロジック ビットを動的に含めるよりも「必須」にすることを好みます。

于 2011-05-15T01:27:58.527 に答える