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

Omi*_*gar 7 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
Run Code Online (Sandbox Code Playgroud)

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

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

Tri*_*rip 2

您不使用是正确的redirect。重定向正在加载全新的资源。

render但是,将使您的会话数据保持最新,并且根据表单的设置方式,重新填充输入的任何数据。

你提到:

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

不,这不是真的。如果你说render 'new',它将转到该网址而users/new不是创建。创建操作仅处理POST对控制器的请求,通常不会有与之关联的视图。相反,它将指的new是处理任何错误和显示表单的操作。

create 操作与update仅处理请求来执行相同操作的操作有共同点PUT,但指的edit是处理视图显示的操作。

  • 我知道这已经有 3 年历史了,但我也遇到了同样的问题,并且 `render :new` 没有给我们正确的 URL。它确实保留了表单数据并显示错误消息,但 URL 是“/users”而不是“/users/new”。如果有人能提供一些线索,我肯定很想得到这个答案。 (8认同)