如何显示所选序列化哈希的键?

问题描述 投票:0回答:1

我有一个复选框的序列化哈希,我想只显示选定的键。

模型

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>
ruby-on-rails ruby ruby-on-rails-3 json ruby-on-rails-3.1
1个回答
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>
热门问题
推荐问题
最新问题