2012-04-11 72 views
0

我試圖更新模型中的多個記錄的領域,領導。每個導聯都顯示在一個錶行中,並且爲多行修改的字段是「selected」,這是一個布爾值,存儲爲tinyint 1或0,true或false。Rails - 如何通過列表操作中的表單更新多個記錄?

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

FYI:(73個引用在此行中我的控制器:@leads = Lead.find(params[:lead_ids])) 當我看這個,它看起來像是一起路過的一切,就像我'd想要它...主角模型,採取id 6,設置選擇1.現在採取ID 1,選擇設置爲0.真正令我困惑的是,「未知鍵」位。 我最初的想法是,它不是在尋找正確的領域來修改...,因爲它知道我在尋找「6」,但是「6」怎麼樣? 「6」不是關鍵。 Id 6,還是別的? 有沒有人解決了這個問題?預先感謝您的想法。

回答

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| 

它手動通過每個PARAM循環和分配基礎上的指數。因此,對於每個id(例如1),它將獲取該數組的第一個索引,並手動將其分配給同一數組的第二個索引。

再一次,不是非常像Rails一樣,絕對不是這樣做的方式,但它的工作原理。任何有更好方式的人,都可以隨時做出貢獻。

0

也許你需要通過#to_i傳遞每個密鑰?這些參數全部以字符串形式返回。 #find(可能)需要每個id的整數。

+0

我敢打賭,你點上... http://stackoverflow.com/questions/8877737/recursively-convert-all-numeric-strings-to-integers-in-a-ruby-hash 這個解決方案似乎解決了我的問題,但是我沒有看到在Ruby文檔中的任何地方進行修復,並且在定義fixnumify時,他從內部調用該方法...? 任何想法如何製作這個?我正在尋找將散列中的所有數字字符串轉換爲整數。 – DerektheDev 2012-04-11 18:46:06

+0

請參閱上面的...新到Stack Overflow,沒有意識到它沒有通知你。 – DerektheDev 2012-04-11 22:15:13

相關問題