我有一个数组:
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"}]
答案 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 %>
通过分离演示者课程,您将获得以下好处: