Rails模型的某些属性未通过update_attributes方法更新

时间:2015-01-15 23:08:58

标签: ruby-on-rails ruby-on-rails-4 activerecord model update-attributes

刚刚开始使用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属性不会更新。如果我查看服务器日志,我会看到以下内容:

  

参数:{...&#34;评论&#34; =&gt; {&#34;评分&#34; =&gt;&#34; 5&#34;,&#34; review_text&#34; = &gt;&#34;多么好的啤酒&#34;},&#34; beer_id&#34; =&gt;&#34; 4&#34;,&#34; on_wishlist&#34; =&gt;&#34; f&#34;,&#34;提交&#34; =&gt;&#34;更新评论&#34;,&#34; id&#34; =&gt;&#34; 7&#34;}

...

  

SQL(0.5ms)UPDATE&#34;评论&#34; SET&#34;评级&#34; =?,&#34; review_text&#34; =?,&#34; updated_at&#34; =?在哪里&#34;评论&#34;。&#34; id&#34; = 7 [[&#34;评级&#34;,5],[&#34; review_text&#34;,&#34;多么好的啤酒&#34;],[&#34; updated_at&#34;,& #34; 2015-01-15 22:51:56.009256&#34;]]

所以我可以看到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

我确定我错过了一些简单的事情 - 谢谢你的帮助。

1 个答案:

答案 0 :(得分: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]' %>