我有一个名为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
对我缺少的东西有任何想法吗?
答案 0 :(得分:18)
有四个原因导致这种情况发生:
resolved
已在数据库中设置为true。resolved=
方法,它不再设置属性。attr_protected :resolved
。attr_accessible
但列表中没有:resolved
。答案 1 :(得分:1)
您的布尔列是否有默认值?如果它默认为true - rails可能不会将其添加到属性集中。
或者,您是否为该列设置了attr_protected?如果是这样 - rails将永远不会使用update_attributes将该字段添加到属性中。您需要手动执行此操作。
答案 2 :(得分:1)
所有
我最近开始使用rails并且正在接管其他人的代码,并发现了另一个未被覆盖的方案,这些方案让我感到兴奋。
当使用此链接指向的样式时,params以单独的方法形成。我不得不更新“_params”方法,将其添加到允许列表中。
http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html
答案 3 :(得分:0)
你确定该元素被发送了吗? 我的意思是,没有选中元素的表单元素没有被发送,所以你必须为隐藏的复选框设置默认的false。