このコードを検討してください
module Auth
def sign_in(user)
#some stuff
session[:user_id] = user.id
end
end
ここで、これをアプリケーション コントローラーに含めたいと思います。
ApplicationController < ActionController::Base
include Auth
end
これにより、sign_in
メソッドがすべてのコントローラーで使用可能になります。ここで、これがコントローラーのアクションではないことを明確にするために、名前を維持したいので、私のコントローラーは読み取ります
def sign_user_in
# Some stuff
Auth.sign_in(@user)
end
Rails は Auth モジュールでクラス メソッドを探すため、これは明らかに機能しません。問題は...モジュールをコントローラーに含めて、その名前または名前空間を保持しながら、コントローラーと同じスコープにアクセスすることは可能ですか? (この場合、セッション変数)。
これまでのところ、私が思いついた最も悪い方法は、モジュールを ApplicationController に含めるのをやめ、代わりに、次のような認証メソッドを呼び出すときにアプリケーションコントローラーインスタンスを渡すことです。
def current_user(controller)
User.find(controller.session[:user_id])
end
self
引数としてusing を使用してコントローラーからこのメソッドを呼び出すと機能します。