刚开始使用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
我敢肯定,我失去了一些东西简单 - 您的帮助感谢。
啊,我知道这很简单,我忽略了。谢谢,我非常感谢帮助。 – dayman