0

刚开始使用Rails 4.1,我很难理解当我尝试使用update_attributes方法更新模型时发生的事情。我已经编写了一个小应用程序来学习,让用户查看啤酒。用户可以使用类似如下的表格编辑点评:Rails模型的某些属性没有被update_attributes方法更新

<%= form_for review do |f| %> 
<%= f.label :rating %> 
<%= f.select :rating, 1..5%> 
<%= f.label :review_text %> 
<%= f.text_area :review_text %> 
<%= hidden_field_tag :beer_id, @beer.id %> 
<%= hidden_field_tag :on_wishlist, "f" %> 
<%= f.submit %> 
<% end %> 

控制器有一个简单的更新操作,看起来像这样:

@review.update_attributes(review_params) 

,参数如下图所示:

def review_params 
    params.require(:review).permit(:rating, :user_id, :beer_id, :review_text, :on_wishlist) 
end 

所有非常简单。我不明白为什么这只能更新一些属性。特别是,on_wishlist属性不会被更新。如果我查看服务器日志,我会看到以下内容:

参数:{...“review”=> {“rating”=>“5”,“review_text”=>“真棒啤酒” }, “beer_id”=> “4”, “on_wishlist”=> “F”, “提交”=> “更新评论”, “ID”=> “7”}

...

SQL(0.5ms)UPDATE“reviews”SET“rating”=?,“review_text”=?,“updated_at”=? WHERE“reviews”。“id”= 7 [[“rating”,5],[“review_text”,“What a good beer”],[“updated_at”,“2015-01-15 22:51:56.009256”] ]

因此,我可以看到on_wishlist隐藏字段正在发送到服务器,只是未包含在更新中,即使它在review_params哈希中。

如果我控制器代码更改为以下,正常工作:

@review.update_attributes(review_params) 
@review.on_wishlist = params[:on_wishlist] 
@review.save 

但我不明白为什么on_wishlist应该要分别对待。唯一相关的细节,我能想到的是,on_wishlist在从审查的其余部分单独的迁移增加,如下:

class AddOnWishlistToReviews < ActiveRecord::Migration 
    def change 
    add_column :reviews, :on_wishlist, :bool, :default => false 
    end 
end 

我敢肯定,我失去了一些东西简单 - 您的帮助感谢。

回答

0

这是因为您在形式中将beer_idon_wishlist定义为单独的字段。您使用对象格式f定义的其他字段。

你可以看到PARAMS被发送到服务器,你只需要:

"review"=>{"rating"=>"5", "review_text"=>"What a good beer"} 

所以,你的对象@review只能更新这些字段。 review_params实际上是params[:review]

所以,如果你想更新beer_idon_wishlist,可以使这些领域属于通过f对象的形式对象:

<%= f.hidden_field :beer_id, value: @beer.id %> 
<%= f.hidden_field :on_wishlist, value: "f" %> 

或改变他们的名字:

<%= hidden_field_tag :beer_id, @beer.id, name: 'review[beer_id]' %> 
<%= hidden_field_tag :on_wishlist, "f", name: 'review[on_wishlist]' %> 
+0

啊,我知道这很简单,我忽略了。谢谢,我非常感谢帮助。 – dayman