我有一个控制器,它的每个方法都以以下代码开头:
@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
我只是想知道在这种情况下是否可以避免代码重复?
是的,使用before_filter
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
您不必担心“返回”,因为一旦发生重定向,rails 就会退出过滤器管道。
为避免重复,您只需在要检查用户身份验证的每个控制器中添加 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 辅助方法来获取当前用户。
尝试在过滤器之前使用。这应该没问题