0

我知道这可能是一个愚蠢的问题。我正在尝试使用这个 xml 解析器

http://nokogiri.rubyforge.org/nokogiri/Nokogiri.html

我把下面的代码放在了一个bringRSS方法(?)的控制器中,它在IRB中运行良好。但是我如何获取puts link.content的值到我的视图中

 def bringRSS

  require 'nokogiri'
  require 'open-uri'

  # Get a Nokogiri::HTML:Document for the page we’re interested in...

  doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))


  # Do funky things with it using Nokogiri::XML::Node methods...

  ####
  # Search for nodes by css
  doc.css('h3.r a.l').each do |link|
    puts link.content

  end

  ####
  # Search for nodes by xpath
  doc.xpath('//h3/a[@class="l"]').each do |link|
    puts link.content
  end

  ####
  # Or mix and match.
  doc.search('h3.r a.l', '//h3/a[@class="l"]').each do |link|
    puts link.content
  end


 end
4

3 回答 3

3

你的方法是 rails action 吗?如果是这样,“puts”方法是不合适的。您应该定义一些可在视图中访问的全局变量。

@css_content = Array.new
doc.css('h3.r a.l').each do |link|
    @css_content << link.content
end

您定义一个包含每个链接的 @css_content 数组。在您的视图中,您可以像通常在视图中使用它们一样使用该 var。

于 2009-10-12T12:19:49.933 回答
1

在 Rails 动作中使用 puts 会引发异常。

相反,只需将数据分配给实例变量,如下所示:

@link_content = []
...
doc.css('h3.r a.l').each do |link|
    @link_content << link.content
end
...

您可以稍后在视图中使用相同的名称访问它

于 2009-10-12T12:17:46.007 回答
1

从技术上讲,您可以直接写入您的回复,因为它的行为或多或少类似于您puts在 IRB 中的对象。但正如上面提到的,Rails 的做法是使用控制器分配给实例变量,并使用您的视图来呈现它们。

作为一个好处,您将能够在分配时使用一些非常好的 Ruby:

@links = doc.css('h3.r a.l').map{|link|link.content}

将映射每个对象的content方法返回的内容,就像您在上面所做的一样。而且由于 Rails 通过为符号对象提供 to_proc 方法来扩展它,您可以将其缩短为

@links = doc.css('h3.r a.l').map(&:content)
于 2009-10-12T12:28:18.827 回答