使用“super”和“redirect_to”?

时间:2013-08-11 21:32:26

标签: ruby-on-rails

我很困惑redirect_to如何工作......在下面的代码中,我有一个授权方法,无论如何重定向(就像我的问题的一个例子,我的应用程序中有一个if语句)。然后在我的UsersController中,我想扩展authorize方法,并在它下面添加一些逻辑。

我得到错误“未定义的方法username为nil:NilClass”。 (好吧,没有定义current_user但在此语句之前应该有重定向)

我的问题是,为什么当对“super”的调用应该重定向时,UsersController授权方法中的代码是否应该重定向,并且该代码不应该被执行?

class ApplicationController < ActionController::Base
  before_filter :authorize

  def authorize
    redirect_to root_path, alert: 'Not authorized'
    return false
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

class UsersController < ApplicationController

  def authorize
    super
    return true if current_user.username == 'admin'
  end
end

1 个答案:

答案 0 :(得分:2)

redirect_to不会停止方法调用链。你只是调用那里的方法,告诉控制器发回一个重定向头。如果您希望authorize中的UsersController方法有效,则需要这样:

super && current_user.username == 'admin'

您需要修改ApplicationController的{​​{1}}方法以返回authorize。如果true的{​​{1}}返回ApplicationControllerauthorize也返回true,那么您的UsersController current_user.username中的新代码也会返回{{} 1}}。