在创建错误时,我应该渲染`new`还是重定向到`new`?

时间:2012-07-30 08:56:56

标签: ruby-on-rails

假设我有这样的事情:

def new
  @user = User.new
end
def create
  @user = User.create(params[:user])
  if @user.save
    flash[:notice] = 'User created'
    redirect_to :action => 'list'
  else
    flash[:error] = 'Some error here!'
    render 'new'
  end
end

我认为代码很清楚 这里的问题是,当@user对象未成功保存时,我应该呈现new(如上所述)还是应该重定向到new

我知道如果重定向到new用户输入的数据会丢失,但如果我呈现new,则网址将为/users/create而不是/users/new(其中太丑了!)。

1 个答案:

答案 0 :(得分:2)

你没有使用redirect是正确的。重定向正在加载一个全新的资源。

render会保持会话数据的新鲜度,并且根据表单的设置方式,重新填充输入的数据。

你提到:

我知道如果重定向到新用户输入的数据会丢失,但如果我渲染新的,则URL将是/ users / create而不是/ users / new(这很丑!)。

不,这不是真的。如果您说render 'new',则会转到您未创建的网址users/new。创建为操作仅处理对您的控制器的POST请求,并且通常永远不会有与之关联的视图。它将引用new操作来处理任何错误并显示表单。

创建操作与update操作有此共同点,该操作通过仅处理PUT请求执行相同操作,但引用edit操作来处理视图的显示。