Mat*_*zzi 65 ruby-on-rails ruby-on-rails-3
我是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
Run Code Online (Sandbox Code Playgroud)
和:
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
Run Code Online (Sandbox Code Playgroud)
nmo*_*ott 117
虽然这是正确的create调用new,然后save有他们的返回值的两个备选方案之间有很大的区别.
Save返回true或者false取决于对象是否已成功保存到数据库.然后,这可以用于上述问题中的第一个示例的流量控制.
Create无论对象是否已保存,都将返回模型.这对上面的代码有影响,因为if即使对象验证失败并且未保存,语句的顶部分支也将始终执行.
如果使用create分支逻辑,则存在静默失败的风险,如果使用new+ 则不是这种情况save.
在create其中替代可以在控制器有用respond_with用于API(JSON/XML)应答.在这种情况下,对象上存在错误将导致错误在响应中返回,状态为unprocessable_entity,这正是您想要的API.
我总是使用html 的new+ save选项,特别是如果你依赖于流量控制的返回值.
pju*_*ble 52
在内部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
Run Code Online (Sandbox Code Playgroud)
Mic*_*ant 19
new 创建对象但不保存它.
create创建对象并保存它,即.new和.save
create!创建对象并尝试保存它但如果验证失败则引发异常,例如.new和.save!
混淆项之一是上面是对对象采取的操作,但控制器方法也有类似的名称,特别是在RESTful环境中.例如,你有一个创建动作....创建一个新对象,然后保存它和另一个创建一个对象创建的动作.
如果你想知道"为什么要创建一个对象,如果我不打算保存它?" 考虑这一点 - 系统'尝试'保存对象 - 但验证会阻止它,并且要求用户填写表单上的更多信息,可能是必填字段.一个人希望.new在进行此操作时仍然创建对象(),它将保存到目前为止已分配的值.然而,在save它通过验证之前它实际上并没有得到d.
使用时,rails实际上是在创建记录,但没有保存,因此在此过程中,您还可以分配smth
@item = Item.new(params[:item])
Run Code Online (Sandbox Code Playgroud)
但是当您使用时:
if Item.create(params[:item])
.....
Run Code Online (Sandbox Code Playgroud)
它将立即创建并保存
你可以用 rails c
| 归档时间: |
|
| 查看次数: |
37617 次 |
| 最近记录: |