New + save 和 create 之间的 Rails 差异

我是 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
49901 次浏览

当您使用时,Rails 实际上正在创建记录,但是没有保存它,所以在这个过程中您还可以分配 smth

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

但是当你使用:

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

它会立即创建和保存

你可以用 rails c检查一下

new创建对象但不保存它。

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

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

令人困惑的一个问题是,上面所说的是您对一个对象所采取的操作,但是控制器方法也有类似的名称,特别是在 RESTful 环境中。例如,你有一个创建动作... 。它创建一个新对象,然后保存它和另一个创建操作,它只创建一个对象。

如果你想知道“为什么要创建一个对象,如果我不打算保存它?”考虑到这一点——系统“试图”保存对象——但验证阻止了它,并要求用户在表单上填写更多信息,可能是必填字段。人们希望对象仍然被创建(.new) ,而这正在进行,它将保存到目前为止已分配的值。然而,在通过验证之前,它实际上不会得到 saved。

内部 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

虽然 create调用 new,然后调用 save是正确的,但是这两个选项在返回值上有很大的差异。

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

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

如果使用带有分支逻辑的 create,则存在无声故障的风险,而使用 new + save则不会出现这种情况。

在使用 respond_with作为 API (JSON/XML)响应的控制器中,create备选方案非常有用。在这种情况下,对象上错误的存在将导致在响应中返回具有 unprocessable_entity状态的错误,这正是您希望从 API 得到的。

对于 html,我总是使用 new + save选项,特别是当您依赖返回值进行流控制时。