[英]Some attributes of Rails model not being updated by update_attributes method
刚开始使用Rails 4.1,当我尝试使用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 “,” commit“ =>”更新评论“,” id“ =>” 7“}
...
SQL(0.5ms)UPDATE“审阅” SET“评级” =?,“ review_text” = ?,“ updated_at” =? WHERE“评论”。“ id” = 7 [[“评分”,5],[“评论文字”,“多么好的啤酒”],[“ 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
我确定我缺少一些简单的东西-感谢您的帮助。
这是因为您在表单中将beer_id
和on_wishlist
定义为单独的字段。 使用对象形式f
定义的其他字段。
您可以在参数中看到已发送到服务器,您只有:
"review"=>{"rating"=>"5", "review_text"=>"What a good beer"}
因此,您的对象@review
只能更新这些字段。 review_params
实际上是params[:review]
。
因此,如果您想更新beer_id
和on_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]' %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.