从Ruby中的哈希数组中获取值

时间:2016-04-13 19:24:15

标签: ruby ruby-on-rails-4

我有一个数组:

address => [{"data"=>{"zip"=>"60628", "state"=>"IL", "city"=>"chicago", "street"=>"123 Main St. Apt 2"}, "primary"=>true}]

我想在我的视图中以正确的格式显示每件作品:

123 Main St. Apt 2
Chicago, IL 60628

我无法正确显示逻辑以显示此信息。

这个逻辑应该放在哪里,作为我模型中的方法或实际视图中的方法?

我试过了:

<% @applicant.address.map{|x| x[:data]}.each do |address| %>
  <%= address.street %><br><%= address.city %>, <%= address.state %> <%= address.zip %> <br>
      <% end %>

但得到了:

=> [{"zip"=>"60628", "state"=>"IL", "city"=>"chicago", "street"=>"123 main st Apt 2"}]

2 个答案:

答案 0 :(得分:2)

地图为您提供了一个新数组,如果您使用哈希,则需要使用哈希[:key]或hash [“key”]运算符访问这些值,请尝试:

<% @applicant.address.each do |address_hash| %>
  <% address = address_hash["data"] %>
  <%= address["street"] %><br><%= address["city"] %>, <%= address["state"] %> <%= address["zip"] %> <br>
<% end %>

但如果我是你,我会把数据放在一个结构数组中,它更具可读性。

在你的模特或助手中:

address = Struct.new(:street, :city, :state, :zip)
address.street = ..
...
@addresses << address
etc

在您看来:

<% @addresses.each do |address| %>
  <%= address.street %><br><%= address.city %>, <%= address.state %> <%= address.zip %> <br>
<% end %>

答案 1 :(得分:1)

对于你的第一个问题,这样的事情就足够了:

#!/usr/bin/env ruby

require 'ostruct'

address = [
  {
    'data'    => { 
                   'zip'    => '60628',
                   'state'  => 'IL',
                   'city'   => 'chicago',
                   'street' =>'123 Main St. Apt 2'
                 },
    'primary' => true
   }
]

class AddressPresenter
  def initialize(address)
     @address = OpenStruct.new(address)
  end

  def to_s
    "#{@address.street} \n#{@address.city} #{@address.state} #{@address.zip}"
  end
end

address.each do |a|
  puts AddressPresenter.new(a['data'])
end

现在,对于第二个问题,我将实现一个 Presenter 类,其唯一目标是&#34;呈现&#34;您在视图中需要的任何格式的数据,这允许您使用0表示逻辑保持您的视图。因此,在这种情况下,可以对类AddressPresenter进行重新设计,以便在视图中以to_s正确的HTML格式返回。你会做类似的事情:

<% @applicant.address.each do |address| %>
  <%= AddressPresenter.new(address['data']).to_s %>
<% end %>

通过分离演示者课程,您将获得以下好处:

  1. 你的模特不担心如何展示/渲染东西,因为那不是他们的工作
  2. 您可以测试此演示者以确认它返回您在视图中预期的任何内容
  3. 您的观点不包含任何复杂的逻辑