【问题标题】:Differences in rails between new + save and createnew + save 和 create 之间的 rails 差异
【发布时间】:2012-03-20 16:56:58
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

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

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

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

    如果您将create 与分支逻辑一起使用,您将面临静默失败的风险,如果您使用new + save,则不会出现这种情况。

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

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

    【讨论】:

    • "如果您使用带有分支逻辑的 create,您将面临静默失败的风险,而如果您使用 new + save,则不会出现这种情况。"谢谢!
    • 对于对象验证和创建速记使用:.create(...).valid? 它将返回 true 并创建对象或返回 false 并且什么也不做。
    • 我说在模态中newsave 更好吗? @nmott 这就是 HTML 的意思吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      new 创建对象但不保存它。

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

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

      其中一个混淆项是上面是您对对象执行的操作,但控制器方法也有类似的名称,尤其是在 RESTful 环境中。例如,您有一个 create 动作.... 创建一个新对象,然后保存它,另一个 create 动作只是创建一个对象。

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

      【讨论】:

        【解决方案4】:

        在你使用的时候,rails实际上是在创建记录但没有保存,所以在这个过程中你也可以赋值

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

        但是当你使用时:

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

        它会立即创建并保存

        您可以通过rails c查看它

        【讨论】:

        • 好的,但在我的情况下,使用 new+save 或仅直接创建之间存在差异?
        猜你喜欢
        • 1970-01-01
        • 2014-01-01
        • 2019-03-23
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 2011-06-27
        相关资源
        最近更新 更多