我有以下代码
def show
unless logged_in?
login_required
return
end
#some additional code
#that should only execute
#if user is logged in
end
这完美无缺。
现在我想将登录检查移动到之前的过滤器中。
问题是,当我从show之外的方法返回时,它不会停止show的执行...我如何阻止show
使用外部方法的代码(即可以从之前的过滤器调用吗?
谢谢!
答案 0 :(得分:17)
在rails 2.0.1及更高版本中,您需要重定向或发送响应以停止执行操作。
来自Agile Web Development with Rails Errata:
#45840:以下内容不正确:
“如果before过滤器返回false,则过滤器链的处理终止,并且不会运行该操作。过滤器也可以呈现输出或重定向请求,在这种情况下,原始操作永远不会被调用。”
before_filter不再停止处理过滤器链,返回false。
从Rails 2.0.1的发行说明: *更改before_filter停止在渲染或重定向上自动发生但不再仅仅返回false [David Heinemeier Hansson]
- Rob Christie
redirect_to
,render
和head
都会暂停执行。例如,head :ok
将仅使用OK HTTP响应代码响应请求,并且操作将不会执行。
答案 1 :(得分:16)
如果你从before_filter返回false,那么请求的执行将立即停止。
如果你只是让你的login_required方法返回false(或重定向),如果他们没有登录,并使它返回true,如果它们只是before_filter :login_required
,它应该可以正常工作。
编辑:正如Lenry在下面所述,这在Rails 2.0.1+中不起作用
相反,要停止请求,请在代码中使用head :ok
答案 2 :(得分:0)
要暂停Rails 5中的回调链,您可以使用
throw :abort