新+保存和创建之间的差异


67

我是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

和:

  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

Answers:


57

然后内部create调用:newsave

  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

126

尽管create调用正确,new然后save这两种选择之间的返回值却有很大差异。

Save返回truefalse取决于对象是否已成功保存到数据库。然后可以按照上述问题的第一个示例将其用于流量控制。

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

如果create与分支逻辑一起使用,则存在静默失败的风险,而使用new+则不会save

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

我将始终对HTML使用new+save选项,尤其是如果您依赖流控制的返回值。


2
“如果使用带有分支逻辑的创建,则可能会出现静默失败的风险,而使用new + save则不会。” 谢谢你!
jacoulter,2015年

对于对象验证和创建速记使用: .create(...).valid?它将返回true并创建对象,或者返回false而不执行任何操作。
neonmate

我说对方法new和方法更好的对save吗?@nmott是HTML的意思吗?
atw 2016年

21

new 创建对象但不保存。

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

create!创建该对象,并试图挽救,但如果验证失败,抛出一个异常,如.new.save!

令人困惑的一项是,以上是您对对象执行的操作,但是控制器方法也具有相似的名称,尤其是在RESTful环境中。例如,您有一个create action ....,它创建一个新对象,然后保存它,还有另一个create action,它仅创建一个对象。

如果您想知道“如果我不保存对象,为什么要创建一个对象?” 考虑到这一点-系统“尝试”保存对象-但是验证阻止了该对象,并且要求用户在表单上填写更多信息,可能是必填字段。有人希望在创建过程中仍然可以创建该对象(.new),它将保存到目前为止已分配的值。但是,save直到它也通过验证,它才真正得到d。


5

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

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

但是当您使用时:

if Item.create(params[:item])
.....

它将立即创建并保存

你可以用 rails c


好的,但是就我而言,使用new + save或仅直接创建之间有区别吗?
Matteo Pagliazzi 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.