【发布时间】:2023-03-21 00:16:02
【问题描述】:
刚开始使用 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 "reviews" SET "rating" = ?, "review_text" = ?, "updated_at" = ? WHERE "reviews"."id" = 7 [["rating", 5], ["review_text", "多好的啤酒"], ["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
我确定我遗漏了一些简单的东西——感谢您的帮助。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 activerecord model update-attributes