def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
render :action => show
end
render :template => "fix_user_errors"
end
在update_attributes成功的情况下,前面的代码将生成错误(因为渲染被调用两次)。 调用render(和redirect_to)的行为应该以某种方式终止动作的处理?但这不是为什么?
答案 0 :(得分:2)
渲染实际上并不会终止操作的处理。
您需要在if语句中添加 else :
if @user.update_attributes(params[:user])
render :action => show
else
render :template => "fix_user_errors"
end
我认为你也可以使用“return render ...”,它将立即从action方法返回,但这可能会产生意想不到的后果。
答案 1 :(得分:1)
不,调用渲染不会结束您的操作。渲染是一种方法,告诉你的控制器如果你不想要默认的模板将要渲染哪个模板,而不是实际告诉它你已完成处理。
如果你真的完成了,你可能想在调用render之后调用return。
此外,调用重定向(我猜这个,我不确定)实际上会向您的浏览器发送一个Location标头,但不会结束您的操作。调用后你需要返回或分支,所以你不要再调用它两次。
答案 2 :(得分:0)
你可以使用else,没有意义渲染动作并渲染另一个动作。我会这样写:
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
redirect_to :action => show
else
render :template => "fix_user_errors" #probably you want to render the edit template here.
end
end