Rails - 如何通过列表操作中的表单更新多个记录?

时间:2012-04-11 13:42:33

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在尝试更新模型中的多个记录的一个字段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还是其他什么? 有没有人解决过这个问题?提前感谢您的想法。

2 个答案:

答案 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,并且绝对不是这样做的方式,但它有效。任何人都有更好的方式,随时可以贡献。