我有一个控制器,它的每个方法都以下面的代码开头:
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
return
end
我只是想知道在这种情况下是否可以避免代码重复?
答案 0 :(得分:2)
是的,请使用before_filter
class YourController < ApplicationController
before_filter :check_user
def check_user
..
end
end
答案 1 :(得分:2)
绝对
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会从过滤器管道中拯救出来。
答案 2 :(得分:1)
为避免重复,您只需在要检查用户身份验证的每个控制器中添加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帮助程序方法来获取当前用户。
答案 3 :(得分:0)
尝试使用before filter。这应该没问题