2

我有一个控制器,它的每个方法都以以下代码开头:

@user = UserData.find_by_login(session[:cuser])

if @user == nil
  redirect_to(:controller=> 'user_data', :action=> 'login')
  return
end

我只是想知道在这种情况下是否可以避免代码重复?

4

4 回答 4

2

是的,使用before_filter

class YourController < ApplicationController

  before_filter :check_user

  def check_user
  ..
  end

end
于 2012-11-14T11:42:17.627 回答
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 就会退出过滤器管道。

于 2012-11-14T11:42:46.927 回答
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 辅助方法来获取当前用户。

于 2012-11-14T13:16:15.620 回答
0

尝试在过滤器之前使用。这应该没问题

于 2012-11-14T11:42:42.520 回答