为什么在Gemfile中添加redis修复错误:require'redis'

时间:2011-03-03 10:11:03

标签: ruby-on-rails ruby rubygems redis

我在尝试使用带有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中的路径不包含任何宝石。

我们非常感谢您提供的任何见解。感谢您阅读此内容。

1 个答案:

答案 0 :(得分:3)

Bundler禁用系统gem,只使Gemfile中列出的gem(及其依赖项)可供应用程序使用。这就是为什么您的应用所需的任何宝石都应该在Gemfile中。

值得注意的是,捆绑者“需要”宝石,除非你告诉它不要。所以,一旦你告诉它在Gemfile中使用redis gem,你就不需要在应用程序的其他地方使用它了。