コントローラーがあり、そのすべてのメソッドは次のコードで始まります。
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
return
end
この場合、コードの重複を避けることができるかどうか疑問に思っていますか?
コントローラーがあり、そのすべてのメソッドは次のコードで始まります。
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
return
end
この場合、コードの重複を避けることができるかどうか疑問に思っていますか?
class YourController < ApplicationController
before_filter :check_user
def check_user
..
end
end
絶対。
class MyController < ApplicationController
before_filter :ensure_logged_in
# actions here.
def ensure_logged_in
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
end
end
end
リダイレクトが発生すると、レールはフィルター パイプラインから抜け出すため、「リターン」について心配する必要はありません。
重複を避けるには、ユーザー認証を確認するすべてのコントローラーに before_filter を追加するだけです。
class SomeController < ApplicationController
before_filter :authenticate_user
end
次に、アプリケーションコントローラーにユーザー認証ロジックを次のように追加します。
class ApplicationController < ActionController::Base
private
def current_user
@current_user ||= UserData.find_by_login(session[:cuser]) if session[:cuser]
end
helper_method :current_user
def authenticate_user
redirect_to({:controller=> 'user_data', :action=> 'login'}, :alert => "Not authorized") if current_user.nil?
end
end
すべてのコントローラーで current_user ヘルパー メソッドを使用して、現在のユーザーを取得できます。
filter の前に使用してみてください。これでいいはず