0

我正在尝试在我的 Rails 项目中使用 Nokogiri 解析 XML。

这是我的控制器:

def landeplatz
    require 'nokogiri'
    doc = Nokogiri::XML(File.open("#{Rails.root}/public/moredata.xml"))
    @links = doc.xpath('//markers/marker').map do |i| {
        'title' => i.attr('title'), 
        'desc' => i.attr('desc'),
        'email' => i.attr('email'),
        'website' => i.attr('website'),
        'address' => i.attr('address'),
        'type' => i.attr('type')
        }
    end
end

这是我的看法:

<% @links.each do |l| %>
    <% while l['type'] = 'bildung' %>
        <div class="span4 lande-item">
            <h4><%= l['title'] %></h4>
        </div>
    <% end %>
<% end %>

<% @links.each do |l| %>
    <% while l['type'] = 'wirtschaft' %>
        <div class="span4 lande-item">
            <h4><%= l['title'] %></h4>
        </div>
    <% end %>
<% end %>
....

while添加循环时,我看不到任何项目。有谁知道问题出在哪里?

4

1 回答 1

2
  1. 一种可能性是您的@links变量是一个空数组。在这种情况下,您的任何一个块都不会被评估。

  2. 当心=而不是==在你的 while 循环条件下。这将导致无限循环,因为分配将始终返回一个真实值。

  3. 有更多惯用的方法来执行您想要的操作。例如 :

    <% @links.select{|link| 'bildung' == link['type']}.each do |link| %>
      <div class="span4 lande-item">
        <h4><%= link['title'] %></h4>
      </div>
    <% end %>
    

    或使用group_by

    <% @links.group_by{|link| link['type']}['bildung'].each do |link| %>
      <div class="span4 lande-item">
        <h4><%= link['title'] %></h4>
      </div>
    <% end %>
    

    还有许多其他方法,都使用惯用的 ruby​​ 块。在 ruby​​ 中,许多对象实现了该each方法并利用了Enumerable 模块的强大功能:学习如何使用该模块的方法,您几乎不必使用 while 循环。

于 2013-04-16T15:27:14.727 回答