2012-03-09 58 views
0

我有一個複選框的序列化哈希,我想只顯示選定的鍵。如何顯示選定的序列化哈希密鑰?

型號

class Policy < ActiveRecord::Base 
    belongs_to :user 
    serialize :shipping, JSON 
end 

查看

<ul> 
    <%= p.fields_for :shipping, @policy.shipping do |s|%> 
    <li><%= s.check_box :fedex %><%= s.label :fedex %></li> 
    <li><%= s.check_box :dhl %><%= s.label :dhl %></li> 
    <li><%= s.check_box :usps_10 %><%= s.label :usps %></li> 
    </ul> 
<% end %> 

BD

{"fedex":"1","usps":"0","dhl":"0"} 

的Vie W¯¯顯示

<ul> 
    <% if [email protected]? %> 
     <% @policy.shipping.keys.each do |key|%> 
     <li><%= key %></li> 
     <% end %> 
    <% end %> 
</ul> 

回答

1

@policy.shipping應該是一個普通的老哈希所以select應排在你出去:

<ul> 
    <% if @policy.shipping.present? %> 
    <% @policy.shipping.select { |k, v| v == 1 }.keys.each do |key| %> 
     <li><%= key %></li> 
    <% end %> 
    <% end %> 
</ul> 

我不知道把我的頭頂部,如果你會得到1'1'儘管如此,您可能需要v == '1'select區塊內。

您可以通過採取的事實的優點跳過.present?(或!...nil?)檢查nil.to_a[]還有:

<ul> 
    <% @policy.shipping.to_a.select { |k, v| v == 1 }.map(&:first).each do |key| %> 
    <li><%= key %></li> 
    <% end %> 
</ul> 

甚至:

<ul> 
    <% @policy.shipping.to_a.select { |k, v| v == 1 }.each do |a| %> 
    <li><%= a.first %></li> 
    <% end %> 
</ul> 

而且你可能想修正您的原始視圖將被正確嵌套,否則您可能會在將來遇到奇怪的事情:

<ul> 
    <%= p.fields_for :shipping, @policy.shipping do |s|%> 
    <li><%= s.check_box :fedex %><%= s.label :fedex %></li> 
    <li><%= s.check_box :dhl %><%= s.label :dhl %></li> 
    <li><%= s.check_box :usps_10 %><%= s.label :usps %></li> 
    <% end %> 
</ul> 
+0

畝!非常感謝你的人!我幾乎打破了我的脖子,試圖找到解決方案!是的,你會得到'1'而不是1 – dcalixto 2012-03-09 05:29:24