【问题标题】:Some attributes of Rails model not being updated by update_attributes methodRails 模型的某些属性没有被 update_attributes 方法更新
【发布时间】: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


    【解决方案1】:

    这是因为您在表单中将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]' %>
    

    【讨论】:

    • 啊,我知道我忽略了一些简单的事情。谢谢,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2019-08-16
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多