我正在尝试更新模型中的多个记录的一个字段Lead。每个引导都显示在一个表行中,并且为多行修改的字段是“selected”,这是一个布尔值,存储为tinyint 1或0,true或false。
leads_controller.rb
def list
@leads = Lead.where({:store_number => session[:store_number]}).order("selected DESC")
@targeted_leads = Lead.where(:store_number => session[:store_number], :selected => true)
end
def update_multiple
@leads = Lead.find(params[:lead_ids])
@leads.update(params[:lead_ids])
redirect_to(:action => 'list')
end
list.html.erb
<%= form_tag update_multiple_leads_path, :method => :put do %>
<table>
<thead>
<tr>
<th>Lead Name</th>
<th>Selected Leads</th>
</tr>
</thead>
<tbody>
<% for lead in @leads %>
<tr>
</td>
<td><%= lead.company_name %></td>
<td>
<%= fields_for("lead_ids[]", lead) do |f| %>
<%= f.check_box("selected") %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<%= submit_tag('Save Targeted Leads', :class => "btn") %>
<% end %>
现在,我希望这个表单要做的是传递所有引导,如果选中,则将该记录的“selected”字段更新为1,如果未选中,则将该字段更新为0。
传递时,以下是update_multiple操作的结果:
ArgumentError in LeadsController#update_multiple
Unknown key: 6
Rails.root: (my/rails/root)
Application Trace | Framework Trace | Full Trace
app/controllers/leads_controller.rb:73:in `update_multiple'
Request
Parameters:
{"commit"=>"Save Targeted Leads",
"lead_ids"=>{"6"=>{"selected"=>"1"},
"1"=>{"selected"=>"0"},
"3"=>{"selected"=>"0"}},
"authenticity_token"=>"ALYtIkJNsAANsHXaAvgeb84G9Ms7OPSkyFO6jkM19yU=",
"_method"=>"put",
"utf8"=>"\342\234\223"}
仅供参考:(第73行在我的控制器中引用此行:@leads = Lead.find(params[:lead_ids])
)
当我看到它时,看起来它正在传递所有内容,就像我想要它...领导模型,取id 6,设置选择为1.现在取id 1,设置选择为0.什么真的令人困惑我是那个“未知的钥匙”位。
我最初的想法是,它不是在寻找正确的字段来修改......因为它知道我在寻找“6”,但是“6”呢? “6”不是关键。 Id 6还是其他什么?
有没有人解决过这个问题?提前感谢您的想法。
答案 0 :(得分:0)
也许您需要通过#to_i
传递每个密钥?参数都以字符串形式返回。 #find
(可能)需要每个id的整数。
答案 1 :(得分:0)
想出来!花了我几天(我对红宝石很新),但我有一些工作要做。这只适用于这种特殊情况,因为它不灵活...... Rails可能有更好的方法来做到这一点,但对于其他正在进行的操作:
def update_multiple
params[:lead_ids].each do |lead|
record = Lead.find(lead[0])
record.update_attributes(lead[1[0]], lead[1[1]])
end
redirect_to(:action => 'index')
end
值得注意的是,关于之前的评论,它与无关紧要(至少就我的目的而言)是一个字符串,因此不需要哈希...但是如果你想这样做,我写了这个在调试时。
the_hash = Hash[params[:lead_ids].map {|key, array| [key.to_i, array]}]
然后将散列传递给每个循环,所以......
the_hash.each do |lead|
它手动循环遍历每个参数并根据索引进行分配。因此,对于每个id(例如,1),它将获取该id的数组的第一个索引,并手动将其分配给同一数组的第二个索引。
同样,不是很像Rails,并且绝对不是这样做的方式,但它有效。任何人都有更好的方式,随时可以贡献。