0

モデル、Lead の複数のレコードの 1 つのフィールドを更新しようとしています。各リードは表の行に表示され、複数の行に対して変更されるフィールドは「選択」されます。これはブール値であり、tinyint 1 または 0、true または false として保存されます。

lead_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 を取得し、selected を 1 に設定します。次に、ID 1 を選択し、選択を 0 に設定します。私を本当に混乱させているのは、その「不明なキー」ビットです。私の最初の考えは、変更する正しいフィールドを探していないということです...つまり、「6」を探していることを知っていますが、「6」はどうですか? 「6」はキーではありません。ID 6 か、それとも何か?他の誰かがこれを解決しましたか?よろしくお願いします。

4

2 に答える 2

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]}]

次に、ハッシュを each ループに渡します。

the_hash.each do |lead|

各パラメーターを手動でループし、インデックスに基づいて割り当てます。したがって、各 ID (たとえば、1) について、その ID の配列の最初のインデックスを取得し、それを同じ配列の 2 番目のインデックスに手動で割り当てます。

繰り返しますが、あまり Rails に似ているわけではなく、間違いなくそれを行う方法ではありませんが、機能します。より良い方法をお持ちの方は、お気軽に貢献してください。

于 2012-04-12T18:04:05.953 に答える