新的+保存和创build之间的轨道差异

我是新来的铁轨,我不明白使用新的+保存方法和创build方法之间的差异。

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 

内部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调用newsave是正确的,但是在返回值中两个选项之间存在很大差异。

根据对象是否成功保存到数据库, Save返回truefalse 。 这可以用于上述问题的第一个例子中的stream量控制。

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

如果您使用分支逻辑create ,则存在无声失败的风险,如果您使用new + save ,则不是这种情况。

在用于API(JSON / XML)响应的respond_with控制器中, create方法可能非常有用。 在这种情况下,对象上存在的错误将导致错误在响应中返回,状态为unprocessable_entity ,这正是您所需要的API。

我总是使用new + save选项的HTML,尤其是如果你依靠stream量控制的返回值。

new创build的对象,但不保存它。

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

create! 创build对象并尝试保存它,但如果validation失败则会引发exception,例如.new.save!

混淆项目之一就是上述是你对一个对象所采取的行动,但是对于控制器方法也给予了类似的名字,特别是在一个RESTful环境中。 例如,你有一个创build动作….它创build一个新的对象,然后保存它,另一个创build动作,只是做一个对象创build。

如果你想知道“如果我不打算保存它,为什么要创build一个对象?” 考虑这个 – 系统试图保存对象 – 但是validation阻止了它,并且要求用户在表单上填写更多的信息,或许是必需的字段。 我们希望这个对象在这个过程中仍然被创build( .new ),它将保存迄今已经分配的值。 然而它实际上并没有得到save直到它通过了validation。

当你使用的时候,rails实际上正在创buildlogging,但是并没有保存它,所以在这个过程中你也可以指定smth

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

但是当你使用:

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

它会立即创build和保存

你可以用rails c来检查它