我刚刚开始使用Ruby on Rails,到目前为止它运行良好。我现在正在尝试实现一个 gem,但它不起作用,我希望这只是一个初学者的错误 - 我还没有掌握的东西!!
我遵循了教程并得到了我的hello world示例 - 还设法将其git推送到我的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
我可以看到那里的nokogiri宝石。
更新
我关闭了本地rails服务器并重新启动。它现在正在工作。不确定是因为将 gem 添加到我的根目录还是进行"捆绑安装"的工作(如下面的帖子所示)。感谢您的帮助。
将控制器更改为类似
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
我猜您也在使用捆绑器,请检查您是否包含此 gem 并运行捆绑安装。
您可以在 http://gembundler.com/
-
您应该将各种
require
语句放在index
方法之外。将它们放在那里不会减慢您的速度,但是您要求 Ruby 确保每次调用该方法时都加载它们。最好只在代码顶部要求它们一次。但是,这不会导致您的问题。 -
我怀疑您正在与IRB运行的环境不同的环境中测试服务器。尝试暂时删除有问题的
require
语句,并将 HTML 模板更改为:<h1>Environment</h1> <ul> <li>Ruby: <%=RUBY_VERSION%></li> <li>Gems: <%=`gem list`%></li> </ul>