【问题标题】:Rails - How do I update multiple records via a form from the list action?Rails - 如何通过列表操作中的表单更新多个记录?
【发布时间】:2012-04-11 13:42:33
【问题描述】:

我正在尝试更新模型中多个记录的一个字段,Lead。每个潜在客户都显示在一个表格行中,为多行修改的字段是“选定的”,它是一个布尔值,存储为 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 %>

现在,我希望这个表单做的是传递所有潜在客户,如果选中,则将该记录的“选定”字段更新为 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,还是别的什么? 有没有其他人解决了这个问题?提前感谢您的想法。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我敢打赌,你一定是在... stackoverflow.com/questions/8877737/… 这个解决方案看起来可以解决我的问题,但我在 Ruby 文档中的任何地方都没有看到 fixnumify,并且在定义 fixnumify 时,他正在调用它方法本身...?知道如何制作这个吗?我正在寻找将哈希中的所有数字字符串转换为整数。
    • 请看上面... Stack Overflow 的新手,没有意识到它没有通知您。
    【解决方案2】:

    想通了!花了我几天(我对 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,而且绝对不是这样做的方法,但它确实有效。任何有更好方法的人,请随时贡献。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多