大多数 Rails 开发者迟早都会看到一个错误消息:Can only render or redirect once per action(动作只能渲染或重定向一次)。这个提示很烦人,也很容易修正。出现这个错误的原因是,没有理解 render
的工作原理。
例如,下面的代码会导致这个错误:
def
show @book
= Book.find(params[ :id ]) if
@book .special? render
action: "special_show" end render
action: "regular_show" end |
如果 @book.special?
的结果是 true
,Rails
开始渲染,把 @book
变量导入 special_show
视图中。但是,show
动作并不会就此停止运行,当
Rails 运行到动作的末尾时,会渲染 regular_show
视图,导致错误出现。解决的办法很简单,确保在一次代码运行路线中只调用一次 render
或 redirect_to
方法。有一个语句可以提供帮助,那就是 and
return
。下面的代码对上述代码做了修改:
def
show @book
= Book.find(params[ :id ]) if
@book .special? render
action: "special_show"
and
return end render
action: "regular_show" end |
千万别用 &&
return
代替 and
return
,因为 Ruby 语言操作符优先级的关系,&&
return
根本不起作用。
注意,ActionController
能检测到是否显式调用了 render
方法,所以下面这段代码不会出错:
def
show @book
= Book.find(params[ :id ]) if
@book .special? render
action: "special_show" end end |
如果 @book.special?
的结果是 true
,会渲染 special_show
视图,否则就渲染默认的 show
模板。