简体   繁体   中英

Cannot require 'nokogiri' in Rails (but works in irb)

I've just started using Ruby on Rails and so far it's working nicely. I'm now trying to implement a gem but it's not working, and I am hoping it's just a beginner mistake - something which I've not yet grasped!!

I've followed tutorials and got my hello world example - also managed to git push this to my Heroku account. I started to follow the tutorial here: http://railscasts.com/episodes/190-screen-scraping-with-nokogiri and got the following code working in Terminal (on 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

So that worked nicely. I can see the title inside of terminal. However, when I try to put this code in my view controller, it cannot find the nokogiri gem. The code in my controller is

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

So then in my HTML, I have

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

Which should output the title as it does in the terminal window. However, I get an error saying no such file to load -- nokogiri

Any ideas where I'm going wrong?
If I do gem list I can see the nokogiri gem there.


UPDATE

I closed the local rails server and restarted. It's now working. Not sure if it was because of the work adding the gem to my root or doing the 'bundle install' (as the posts below suggested). Thanks for the help.

Firstly try changing your controller to be somthing like

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

I'm guessing you are also using bundler, check that you have include this gem and run bundle install.

You can find the documentation for this at http://gembundler.com/

  1. You should put your various require statements outside of your index method. It won't slow you down much to have them in there, but you're asking Ruby to ensure that they are loaded every time the method is called. Better to just require them once at the top of your code. This won't cause your problem, however.

  2. I suspect that you are testing your server under a different environment than what IRB is running in. Try removing the offending require statements for the moment and changing your HTML template to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM