如何阻止rails控制器执行?

Yuv*_*rmi 20 ruby ruby-on-rails

我有以下代码

def show
    unless logged_in?
      login_required
      return
    end
    #some additional code
    #that should only execute
    #if user is logged in
end
Run Code Online (Sandbox Code Playgroud)

这非常有效.现在我想将登录检查移动到之前的过滤器中.问题是,当我从show之外的方法返回时,它不会停止show的执行...我如何停止show使用外部方法的代码(即可以从一个外部方法调用的代码)在过滤之前)?

谢谢!

Len*_*ong 18

在rails 2.0.1及更高版本中,您需要重定向或发送响应以停止执行操作.

使用Rails Errata的敏捷Web开发:

#45840:以下内容不正确:

"如果before过滤器返回false,则过滤器链的处理终止,并且操作不会运行.过滤器也可以呈现输出或重定向请求,在这种情况下,原始操作永远不会被调用."

before_filter不再停止处理过滤器链,返回false.

从Rails 2.0.1的发行说明:*更改before_filter停止在渲染或重定向上自动发生但不再仅仅返回false [David Heinemeier Hansson]

- 罗伯特克里斯蒂

redirect_to,renderhead将全部停止执行.例如,head :ok仅使用OK HTTP响应代码响应请求,操作将不会执行.

  • 除非`render`调用在过滤器链中,否则对`render`*的调用不会*停止执行控制器操作.(http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors) (7认同)
  • 这里的重要区别是必须从`before_filter`调用3个方法才能暂停执行. (4认同)
  • 如果渲染暂停执行,如果渲染两次,为什么会出现双渲染错误? (3认同)

Chr*_*ald 16

如果从before_filter返回false,则请求的执行将立即停止.

如果你只是让你的login_required方法返回false(或重定向),如果他们没有登录,并使它返回true,如果它们,那么before_filter :login_required,它应该完美地工作.

编辑:正如Lenry在下面所述,这在Rails 2.0.1+中不起作用,而是head :ok在代码中停止使用请求