如何阻止rails控制器执行?

时间:2010-09-04 07:04:36

标签: ruby-on-rails ruby

我有以下代码

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使用外部方法的代码(即可以从之前的过滤器调用吗?

谢谢!

3 个答案:

答案 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_torenderhead都会暂停执行。例如,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