0

我正在尝试更新模型中多个记录的一个字段,Lead。每个潜在客户都显示在一个表格行中,并且为多行修改的字段是“选定的”,它是一个布尔值,存储为 tinyint 1 或 0,true 或 false。

引导控制器.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 %>

现在,我希望这个表单做的是传递所有潜在客户,如果选中,则将该记录的“选定”字段更新为 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,将 selected 设置为 0。真正让我困惑的是“未知密钥”位。我最初的想法是,它不是在寻找要修改的正确字段……例如,它知道我在寻找“6”,但是“6”呢?“6”不是键。ID 6,还是别的什么?有没有其他人解决了这个问题?预先感谢您的想法。

4

2 回答 2

0

也许您需要传递每个密钥#to_i?参数均以字符串形式返回。 #find(可能)每个 id 都需要一个整数。

于 2012-04-11T17:03:09.357 回答
0

弄清楚了!花了我几天(我对 ruby​​ 很陌生),但我有一些工作要做。这仅在这种特殊情况下有效,因为它不灵活...... 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

值得注意的是,关于之前的评论,id 作为字符串通过是无关紧要的(至少对我而言),所以不需要散列......但如果你想这样做,我在调试时写了这个。

the_hash = Hash[params[:lead_ids].map {|key, array| [key.to_i, array]}]

然后将哈希传递给每个循环,所以......

the_hash.each do |lead|

它手动循环遍历每个参数并根据索引进行分配。因此,对于每个 id(例如 1),它获取该 id 数组的第一个索引,并手动将其分配给同一数组的第二个索引。

同样,不是很像 Rails,而且绝对不是这样做的方法,但它确实有效。谁有更好的方法,请随时贡献。

于 2012-04-12T18:04:05.953 回答