4

我有一个名为 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

关于我缺少什么的任何想法?

4

4 回答 4

18

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

  1. resolved已在数据库中设置为 true。
  2. 您在模型中定义了该resolved=方法,它不再设置属性。
  3. 你有attr_protected :resolved.
  4. 您有attr_accessible但没有:resolved在列表中。
于 2011-07-18T18:00:46.353 回答
1

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

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

于 2011-07-18T18:00:35.393 回答
1

全部,

我最近开始使用 Rails 并接管了其他人的代码,并发现了另一个在这里没有涉及到的场景让我着迷。

使用此链接指向的样式时,参数以单独的方法形成。我必须更新“_params”方法以将其添加到允许列表中。

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

于 2014-04-13T17:34:23.903 回答
0

你确定元素是发送的吗?我的意思是,没有检查元素的表单元素不会发送,所以你必须为默认 false 放置一个隐藏的复选框。

于 2011-07-18T18:05:14.930 回答