before_filter不会取消动作

53

我在一个刚从1.9(?)升级到2.3.11的Rails应用中遇到了使用before filters的问题。为了调试它,我在一个控制器中加入了一个before_filter:

before_filter :false_filter

在 application_controller.rb 中添加以下内容:

def false_filter
  puts "false filter running"
  false
end

然后我从cucumber/webrat或浏览器调用该方法,虽然过滤器正在被调用(我可以看到puts输出消息),但过滤器链没有被终止。

我想知道是否有一些样板代码没有生成。有人能建议在哪里查找吗?


9
你可能会对 active record 的 before_xxx 方法感到困惑,这些方法在返回 false 时不会保存记录。 - Adrien Coquio
1个回答

99

before filter的返回值不会影响程序的执行。如果您想要停止处理,需要在过滤器中渲染一些内容或者重定向到其他地方,可以参考这篇优秀指南:

如果一个before filter进行了渲染或者重定向,该动作将不会运行。如果有其他过滤器被调度在该过滤器之后执行,它们也会被取消。

5.2.0版指南中也有相同的文字说明。

这种行为是有意义的,如果过滤器链不完整(即在过滤器部分处理时停止),那么您将以不符合预期设置的方式调用控制器方法,这将导致痛苦、困惑和混乱,而这绝不是友好和有趣的。


7
我看的例子是先重定向,然后返回false,我专注于false部分,结果证实我的想法完全正确。这一切都很合理 - 谢谢。 - Henry Collingridge
10
别难过,我也觉得Rails和Ruby的文档在这方面有很多细节不够详尽。 - mu is too short
@muistooshort 需要一些帮助。我正在学习设计模式,其中大部分使用了Interface,而这不是Ruby的主题。所以,我无法理解它们。有什么建议可以学习这些内容吗?我无法用Ruby编写它们。逐行翻译可能不是更好的选择。请给我建议。 - Arup Rakshit
2
这非常有帮助。引用的文本非常明确,正是我需要看到的。 - aaron-coding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接