【问题标题】:How display selected Key of a serialized Hash?如何显示序列化哈希的选定键?
【发布时间】:2012-03-09 04:19:25
【问题描述】:

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

型号

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】:

    你的@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',所以你可能需要在select 块内使用v == '1'

    您可以利用nil.to_a 也是[] 的事实跳过.present?(或!...nil?)检查:

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

    【讨论】:

    • 亩!非常感谢你!我几乎要折断我的脖子试图找到解决方案!是的,你会得到 '1' 而不是 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-06-25
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2013-04-17
    相关资源
    最近更新 更多