我在尝试使用带有rails的redis(2.1.1)gem时遇到了问题。我已经解决了这个问题,但我不知道为什么修复有效并希望更好地理解。
我正在使用Snow Leopard。经过多次故障排除后,我删除了Ruby,Rails和RubyGems的版本,然后使用MacPorts安装Ruby 1.8.7补丁级别334和RubyGems 1.6.0。 Rails现在是3.0.5版本的全新安装。使用“which -a”显示路径中只有一个版本的ruby和gem。
我创建了一个新的rails应用程序并添加了一个简单的控制器,其代码如下:
require 'rubygems'
require 'redis'
class HomeController < ApplicationController
def index
redis = Redis.new
redis.set "mykey", "myvalue"
end
end
当我启动“rails server”并加载页面http://localhost:3000/home/index时,收到以下错误消息:
LoadError in HomeController#index
no such file to load -- redis
Rails.root: /Users/Scott/Projects/Rails/myapp
Application Trace | Framework Trace | Full Trace
app/controllers/home_controller.rb:2
This error occurred while loading the following files:
redis
通过irb使用redis gem时不会发生此错误。
~/Projects/Rails/myapp Scott $ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'redis'
=> true
irb(main):003:0> r = Redis.new
=> #<Redis client v2.1.1 connected to redis://127.0.0.1:6379/0 (Redis v2.2.1)>
我发现使用rails应用程序修复此问题的唯一方法是将redis添加到Gemfile。更改“rails new myapp”创建的默认Gemfile文件后,我不执行任何其他操作,我只是重新加载页面并且它可以正常工作。
source 'http://rubygems.org'
gem 'rails', '3.0.5'
gem 'sqlite3'
gem 'redis'
我在这里和其他地方读过许多类似的问题,关于为什么require语句可能会失败,但是没有发现任何我理解的解释我的情况。如果它有用,“gem env”返回的gem路径是:
RubyGems Environment:
- RUBYGEMS VERSION: 1.6.0
- RUBY VERSION: 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10]
- INSTALLATION DIRECTORY: /opt/local/lib/ruby/gems/1.8
- RUBY EXECUTABLE: /opt/local/bin/ruby
- EXECUTABLE DIRECTORY: /opt/local/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-darwin-10
- GEM PATHS:
- /opt/local/lib/ruby/gems/1.8
- /Users/Scott/.gem/ruby/1.8
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/
Ruby似乎使用相同的路径:
~/Projects/Rails/armatree Scott $ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> puts Gem.path
/Users/Scott/.gem/ruby/1.8
/opt/local/lib/ruby/gems/1.8
=> nil
我注意到这两个路径的顺序不同,但/ Users中的路径不包含任何宝石。
我们非常感谢您提供的任何见解。感谢您阅读此内容。
答案 0 :(得分:3)
Bundler禁用系统gem,只使Gemfile中列出的gem(及其依赖项)可供应用程序使用。这就是为什么您的应用所需的任何宝石都应该在Gemfile中。
值得注意的是,捆绑者“需要”宝石,除非你告诉它不要。所以,一旦你告诉它在Gemfile中使用redis gem,你就不需要在应用程序的其他地方使用它了。