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
我在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
为了澄清起见,此方法要求login_required == false
(或为true)..第一个方法将如何返回false?
困扰您的事实是a#redirect_to
不是return语句:它将响应标记为必须重定向到其他地方,但不会停止执行流程。
redirect_to root_path # executed
puts "foo" # executed
return # executed
puts "bar" # not executed
当您考虑#redirect_to
实施时,其原因实际上是显而易见的。redirect_to
是由rails实现的方法,不是核心语言关键字(例如)return
。
现在,假设您必须实现#redirect_to
自己。你会做这样的事情:
def redirect_to( url )
response.redirect = url
end
现在,您在一个动作中调用该方法:
def index
redirect_to root_path
puts "foo"
end
显然,在这里,您的第二条指令#index
也将被调用,因为您的#redirect_to
方法没有任何意思[1]通知其调用者应停止执行。
注意,这也适用#render
:它们是简单的方法,而不是指令流控制关键字。
[1]实际上,我们可以想到一种中断执行流程的方法:将异常抛出到处理重定向的类捕获的某个地方,但这通常被认为是糟糕的设计,当没有实际错误时使用异常来控制流程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句