我是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
最佳答案
尽管create
调用new
然后save
是正确的,但这两个替代方案的返回值之间存在很大差异。
Save
返回 true
或 false
,具体取决于对象是否已成功保存到数据库。然后,可以按照上述问题中的第一个示例将其用于流量控制。
Create
将返回模型,无论对象是否保存。这对上面的代码有影响,因为即使对象验证失败并且未保存, if
语句的顶部分支也将始终被执行。
如果您将create
与分支逻辑一起使用,您将面临静默失败的风险,而如果您使用new
+ save
,则情况并非如此。
create
替代方案在使用 respond_with
用于 API (JSON/XML) 响应的 Controller 中非常有用。在这种情况下,对象上存在的错误将导致在响应中返回错误,状态为 unprocessable_entity
,这正是您希望从 API 获得的结果。
我总是对 html 使用 new
+ save
选项,特别是当您依赖返回值进行流量控制时。
关于ruby-on-rails - 新建 + 保存和创建之间的 Rails 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791386/