当我尝试将@post.update
替换为@post.save
时,如下面的代码所示,它仍然有效并返回true,但值未更新。
def create
@post = Post.new(post_params)
if @post.save
redirect_to posts_path, notice: 'Post was successfully created.'
else
render action: 'new'
end
end
def update
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'new' }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
下面是我的佣金路线:
$ rake routes
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
root / welcome#index
为什么不更新或覆盖我的记录?
对相同方法使用不同的http请求会对它们产生影响吗?在使用正确的语法传递时,我们可以使用PUT
,GET
,PATCH
和DELETE
进行保存吗?
问题是关于rails 4指南,第一个guide。
答案 0 :(得分:18)
因为save
不接受属性作为参数; save
只能接受validate: false
等参数才能跳过验证。
如果您想使用save
,则需要在save
之前分配或修改单个属性。但是如果你想要大规模分配,update
将是你的选择。
@post.f_name = 'foo'
@post.l_name = 'bar'
@post.update # This will not work
@post.save # This will work
@post.save({:f_name=>"peter",:l_name=>"parker"}) # This will not work
@post.update({:f_name=>"peter",:l_name=>"parker"}) # This will work
答案 1 :(得分:6)
[1] http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html提供了一个很好的解释。
保存(*)链接
保存模型。
如果模型是新的,则会在数据库中创建记录,否则现有记录会更新。
默认情况下,保存始终运行验证。如果其中任何一个失败,则取消操作并保存返回false。但是,如果您提供validate:false,则会完全绕过验证。
保存!(*)链接
保存模型。
如果模型是新的,则会在数据库中创建记录,否则现有记录会更新。
保存!验证总是运行。如果其中任何一个失败,则会引发ActiveRecord :: RecordInvalid。
更新(属性)链接
从传入的哈希中更新模型的属性并保存记录,所有记录都包含在事务中。如果对象无效,则保存将失败并返回false。 别名为:update_attributes
更新!(属性)链接
更新其接收器就像更新一样但是调用保存!而不是保存,因此如果记录无效,则会引发异常。 别名为:update_attributes!
答案 2 :(得分:-1)
准确地说:1。保存将保存您可能不需要的所有课程实例。特别是当验证存在时。 例如@ post.save 它将更新所有属性或列以供发布。