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?
令你烦恼的是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]实际上,我们可以想到一个中断执行流程的意思:抛出由处理重定向的类在某处捕获的异常,但是当没有实际错误时,通常认为使用异常来控制流程是不好的设计.