是否运行了rails方法中的所有行?

Kan*_*ane 3 ruby-on-rails

def login_required
        unless current_user
            store_location
            flash[:notice] = I18n.t('must_be_logged_in')
            redirect_to new_user_session_path
            return false
        end
    end
Run Code Online (Sandbox Code Playgroud)

我在rails应用程序中有这个方法.我的问题是该线何时return false运行?

它前面的那条线说redirect_to new_user_session_path.

def admin_required
        return false if login_required == false
        unless current_user.admin?
            store_location
            flash[:notice] = t('must_be_admin')
            redirect_to new_user_session_url
            return false
        end
    end
Run Code Online (Sandbox Code Playgroud)

为了澄清这个方法需要login_required == false(或者真实)..第一种方法将如何返回false?

kik*_*kik 7

令你烦恼的是a #redirect_to不是一个return语句:它将响应标记为必须重定向到其他地方,但它不会停止执行流程.

redirect_to root_path # executed
puts "foo"            # executed
return                # executed
puts "bar"            # not executed
Run Code Online (Sandbox Code Playgroud)

当您考虑#redirect_to实施时,其实的原因显而易见.redirect_to是一个由rails实现的方法,而不是核心语言关键字return.

现在,想象一下你必须#redirect_to自己实现.你会做那样的事情:

def redirect_to( url )
  response.redirect = url
end
Run Code Online (Sandbox Code Playgroud)

现在,您在操作中调用该方法:

def index
  redirect_to root_path
  puts "foo"
end
Run Code Online (Sandbox Code Playgroud)

显然,在这里,你的第二个指令#index也将被调用,因为你的#redirect_to方法没有意义[1]通知它的调用者它应该停止执行.

请注意,这也适用于#render:它们是简单的方法,而不是指令流控制关键字.

[1]实际上,我们可以想到一个中断执行流程的意思:抛出由处理重定向的类在某处捕获的异常,但是当没有实际错误时,通常认为使用异常来控制流程是不好的设计.