2009-10-12 3 views
0

Я знаю, что это может быть глупый вопрос. Я пытаюсь использовать этот XML Parserпеременная от контроллера в виде в рельсах?

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

Я поместил этот код в контроллере в методе bringRSS (?), И она отлично работает в IRB. Но как же я получаю значения ставит 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 
+0

спасибо за вашу помощь, теперь я получил эту работу, я задаюсь вопросом, где лучшее место для этого кода? Должно ли это быть в контроллере, которое соответствует представлению для страницы? – conspirisi

ответ

3

Ваш метод действие рельсы? Если это так, метод «puts» не подходит. Вы должны определить некоторые глобальные вары, которые будут доступны в представлении.

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

Вы определяете массив @css_content, который содержит все ваши ссылки. И, на ваш взгляд, вы можете использовать этот var так же, как обычно используете их в представлениях.

+0

спасибо, что это сработало, не уверен, что вы подразумеваете под действием «рельсов», это что-то особенное? – conspirisi

+1

В рельсах у вас есть модели, контроллеры, действия и виды. Это принцип MVC. –

1

Использование ставит в действие Rails будет сгенерировано исключение.

Вместо просто присвоить данные переменной экземпляра, например:

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

Вы можете получить доступ к нему позже в своих взглядах с тем же именем

1

Технически вы можете написать прямо на свой ответ, так как он ведет себя более или менее как объект, который вы puts в IRB. Но, как упоминалось выше, Rails способ сделать это - использовать контроллер для назначения экземплярам vars и вашему представлению для их рендеринга.

В пользу, вы будете иметь возможность использовать некоторые действительно хороший рубин при назначении:

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

будет отображать то, что content метод возвращает каждый объект, так же, как вы делали выше. А поскольку Rails расширяет это, давая символ объектов метод to_proc, вы могли бы сократить его

@links = doc.css('h3.r a.l').map(&:content) 
+0

спасибо, кстати, до метода to_proc :), но я вернусь к этому, когда я доберусь – conspirisi

+0

Я не знал про вещь «&:». Не уверен, что это действительно читаемо. Но интересно знать :) –

+0

Читабельность превращения символа в proc была действительно горячей темой в то время, когда она была введена; он фактически превратил его в основной Ruby в 1,9. Pretty? Нет. Практически? Да. – zmalltalker

Смежные вопросы