0

非常に簡単な質問ですが、レールの lib フォルダー内にモジュールがあります。

そのモジュールで Company.accessible_by(current_ability) のようなことをすると、current_ability が定義されていないという名前のエラーが発生します。

誰もこれに対する解決策を知っていますか? current_ability はコントローラーでのみ認識されるようです。

4

1 に答える 1

0

current_ability をモジュールに渡す必要があります。セッションとパラメーター データ (devise を使用している場合は current_user) と同様に、独自に作成したモデルまたはクラス内でこれらにアクセスする方法はありません。

ビジネス オブジェクトを Web スタックに依存させたくないので、これは実際には良いことです。これらの一般的な方法 (モデルにも適用されます) は、渡した current_ability への参照を使用してオブジェクトを構築するか、メソッド呼び出し自体で構築することです。サンプルコードは次のとおりです。

class Foo
  def initialize(ability)
     @current_ability = ability
  end

  def list_companies
    Company.accessible_by(@current_ability)
  end
end

または、1回の呼び出しでのみ必要な場合:

class Foo
  def list_companies(current_ability)
    Company.accessible_by(current_ability)
  end
end

どちらのケースも完全に有効で、Mock 機能オブジェクトを使用してコードを簡単にテストできます。

于 2012-11-20T09:53:20.893 に答える