非常に簡単な質問ですが、レールの lib フォルダー内にモジュールがあります。
そのモジュールで Company.accessible_by(current_ability) のようなことをすると、current_ability が定義されていないという名前のエラーが発生します。
誰もこれに対する解決策を知っていますか? current_ability はコントローラーでのみ認識されるようです。
非常に簡単な質問ですが、レールの lib フォルダー内にモジュールがあります。
そのモジュールで Company.accessible_by(current_ability) のようなことをすると、current_ability が定義されていないという名前のエラーが発生します。
誰もこれに対する解決策を知っていますか? current_ability はコントローラーでのみ認識されるようです。
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 機能オブジェクトを使用してコードを簡単にテストできます。