我有一个复选框的序列化哈希,我想只显示所选的键。
模型
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"}
查看节目
<ul>
<% if !@policy.shipping.nil? %>
<% @policy.shipping.keys.each do |key|%>
<li><%= key %></li>
<% end %>
<% end %>
</ul>
答案 0 :(得分: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>