new + save和create之间的rails的差异

Mat*_*zzi 65 ruby-on-rails ruby-on-rails-3

我是rails的新手,我不明白使用new + save方法和create方法之间的区别.

def create
    @item = Item.new(params[:item])

    respond_to do |format|
      if @item.save
        format.html { redirect_to @item, notice: 'Item was successfully created.' }
        format.json { render json: @item, status: :created, location: @item }
      else
        format.html { render action: "new" }
        format.json { render json: @item.errors, status: :unprocessable_entity }
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

和:

  def create

    respond_to do |format|
      if Item.create(params[:item])
        format.html { redirect_to @item, notice: 'Item was successfully created.' }
        format.json { render json: @item, status: :created, location: @item }
      else
        format.html { render action: "new" }
        format.json { render json: @item.errors, status: :unprocessable_entity }
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

nmo*_*ott 117

虽然这是正确的create调用new,然后save有他们的返回值的两个备选方案之间有很大的区别.

Save返回true或者false取决于对象是否已成功保存到数据库.然后,这可以用于上述问题中的第一个示例的流量控制.

Create无论对象是否已保存,都将返回模型.这对上面的代码有影响,因为if即使对象验证失败并且未保存,语句的顶部分支也将始终执行.

如果使用create分支逻辑,则存在静默失败的风险,如果使用new+ 则不是这种情况save.

create其中替代可以在控制器有用respond_with用于API(JSON/XML)应答.在这种情况下,对象上存在错误将导致错误在响应中返回,状态为unprocessable_entity,这正是您想要的API.

我总是使用html 的new+ save选项,特别是如果你依赖于流量控制的返回值.

  • “如果您使用带有分支逻辑的创建,您将面临静默失败的风险,而如果您使用 new + save,则情况并非如此。” 谢谢你! (2认同)

pju*_*ble 52

在内部create调用new,然后save反正:

  def create(attributes = nil, options = {}, &block)
    if attributes.is_a?(Array)
      attributes.collect { |attr| create(attr, options, &block) }
    else
      object = new(attributes, options, &block)
      object.save
      object
    end
  end
Run Code Online (Sandbox Code Playgroud)


Mic*_*ant 19

new 创建对象但不保存它.

create创建对象保存它,即.new.save

create!创建对象并尝试保存它但如果验证失败则引发异常,例如.new.save!

混淆项之一是上面是对对象采取的操作,但控制器方法也有类似的名称,特别是在RESTful环境中.例如,你有一个创建动作....创建一个新对象,然后保存它和另一个创建一个对象创建的动作.

如果你想知道"为什么要创建一个对象,如果我不打算保存它?" 考虑这一点 - 系统'尝试'保存对象 - 但验证会阻止它,并且要求用户填写表单上的更多信息,可能是必填字段.一个人希望.new在进行此操作时仍然创建对象(),它将保存到目前为止已分配的值.然而,在save它通过验证之前它实际上并没有得到d.


Sai*_*aev 5

使用时,rails实际上是在创建记录,但没有保存,因此在此过程中,您还可以分配smth

@item = Item.new(params[:item])
Run Code Online (Sandbox Code Playgroud)

但是当您使用时:

if Item.create(params[:item])
.....
Run Code Online (Sandbox Code Playgroud)

它将立即创建并保存

你可以用 rails c