Rails: update_attributes不更新所有属性



我有一个名为Discussion的简单模型,其中有一个名为resolved的布尔列。

在我的表单中,我有以下代码
<%= form_for(@discussion) do |d| %>
...
<%= d.check_box :resolved %>
<% end %>

在我的控制器中,我有以下内容:

def update
  @discussion = Discussion.find(params[:id])
  if @discussion.update_attributes(params[:discussion])
    etc...
  end
end

当我提交表单时,我可以看到参数被发送到服务器…

Parameters: {"utf8"=>"✓", "authenticity_token"=>"AsGsRHwiVva/+kTrBs0IjLeZwj1ZmXBuKZr9Pg/N6Xk=", "discussion"=>{"shortdesc"=>"Talk about something.", "content"=>"Try to update check box.", "resolved"=>"1"}, "commit"=>"Update Discussion", "id"=>"1"}

但是查询没有包含任何关于更新该字段的内容。

AREL (14.9ms)  UPDATE "discussions" SET "content" = 'Try to update check box.', "updated_at" = '2011-07-18 17:53:50.783176' WHERE "discussions"."id" = 1

你知道我错过了什么吗?

发生这种情况的原因有四个:

  1. resolved在数据库中已经设置为true。
  2. 你在你的模型中定义了resolved=方法,它不再设置属性。
  3. 你有attr_protected :resolved
  4. 列表中有attr_accessible但没有:resolved

你的布尔列有一个默认值吗?如果它默认为true - rails可能不会费心将其添加到属性集中。

或者,您是否为该列设置了attr_protected ?如果是这样,rails将永远不会使用update_attributes将该字段添加到属性中。您需要手动完成。

All,

我最近开始学习rails,并且正在接管别人的代码,然后发现另一个场景没有在这里介绍,这让我很困惑。

当使用这个链接指向的样式时,参数是在一个单独的方法中形成的。我必须更新"_params"方法,将其添加到允许列表中。

http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

你确定元素被发送了吗?我的意思是,没有选中的表单元素元素不会被发送,所以你需要为默认的false设置一个隐藏复选框。

相关内容

  • 没有找到相关文章

最新更新