当我在下面的代码中尝试用@ post.save替换@ post.update时,它仍然有效并且返回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,第一个guide.
解决方法
因为save不会接受属性作为参数; save只能接受诸如validate:false之类的参数来跳过验证.
如果要使用save,则需要在保存之前分配或修改单个属性.但是如果你想要大规模分配,那么更新将是你的选择.
@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