大多数 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
模板。