新的+保存和创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
调用new
并save
是正确的,但是在返回值中两个选项之间存在很大差异。
根据对象是否成功保存到数据库, Save
返回true
或false
。 这可以用于上述问题的第一个例子中的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
来检查它