从控制器变为轨道中的视图?

时间:2009-10-12 12:15:38

标签: ruby-on-rails xml nokogiri

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

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

我已经将下面的代码放在了一个带有RSS方法(?)的控制器中,它在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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

而只是将数据分配给实例变量,如下所示:

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

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

答案 2 :(得分:1)

从技术上讲,您可以直接写入您的响应,因为它的行为或多或少类似于您在IRB中puts的对象。但如上所述,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)