render(和redirect_to)应该以某种方式终止动作的处理?

时间:2010-05-11 06:48:08

标签: ruby-on-rails

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)的行为应该以某种方式终止动作的处理?但这不是为什么?

3 个答案:

答案 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