Не может требовать nokogiri в Rails (но работает в irb) - PullRequest
1 голос
/ 21 мая 2011

Я только начал использовать Ruby on Rails, и пока он работает хорошо. Сейчас я пытаюсь реализовать драгоценный камень, но он не работает, и я надеюсь, что это просто ошибка новичка - то, что я еще не осознал !!

Я следовал учебным пособиям и получил свой пример с hello world - мне также удалось добавить это в мою учетную запись Heroku. Я начал следовать этому уроку: http://railscasts.com/episodes/190-screen-scraping-with-nokogiri и получил следующий код, работающий в терминале (на Mac)

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=batman&Find.x=0&Find.y=0&Find=Find"
doc = Nokogiri::HTML(open(url))
puts doc.at_css("title").text

Так что это сработало. Я вижу заголовок внутри терминала. Однако, когда я пытаюсь поместить этот код в свой контроллер вида, он не может найти драгоценный камень nokogiri. Код в моем контроллере

class HomeController < ApplicationController
    def index
        require 'rubygems'
        require 'nokogiri'
        require 'open-uri'

        url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=batman&Find.x=0&Find.y=0&Find=Find"
        doc = Nokogiri::HTML(open(url))
        @mattVar = doc.at_css("title").text
    end
end

Итак, в моем HTML у меня есть

<h1>Hello!</h1>
<p><%= @mattVar %></p>

Какой должен выводить заголовок, как это делается в окне терминала. Тем не менее, я получаю сообщение об ошибке no such file to load -- nokogiri

Есть идеи, где я иду не так?
Если я сделаю gem list, я смогу увидеть там камень нокогири.


UPDATE

Я закрыл локальный сервер рельсов и перезапустил. Это сейчас работает. Не уверен, что это произошло из-за работы по добавлению гема в мой корень или из-за установки пакета (как предложено в постах ниже). Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Сначала попробуйте изменить свой контроллер на что-то вроде

class HomeController < ApplicationController
    require 'nokogiri'
    require 'open-uri'

    def index
        url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=batman&Find.x=0&Find.y=0&Find=Find"
        doc = Nokogiri::HTML(open(url))
        @mattVar = doc.at_css("title").text
    end
end

Я предполагаю, что вы также используете bundler, убедитесь, что вы включили этот гем, и запустите установку bundle.

Youдокументацию по этому вопросу можно найти на http://gembundler.com/

1 голос
/ 21 мая 2011
  1. Вы должны поместить свои различные require утверждения вне вашего index метода. Это не сильно замедлит ваше присутствие, но вы просите Ruby убедиться, что они загружаются при каждом вызове метода. Лучше просто потребовать их один раз в верхней части вашего кода. Однако это не вызовет вашей проблемы.

  2. Я подозреваю, что вы тестируете свой сервер в среде, отличной от той, в которой работает IRB. Попробуйте на данный момент удалить ошибочные операторы require и измените свой HTML-шаблон на:

    <h1>Environment</h1>
    <ul>
      <li>Ruby: <%=RUBY_VERSION%></li>
      <li>Gems: <%=`gem list`%></li>
    </ul>
    
...