2011-03-03 70 views
1

我试图在rails中使用redis(2.1.1)gem时遇到了问题。我已经解决了这个问题,但我不知道修复程序为什么会起作用,并希望更好地理解。为什么将redis添加到Gemfile中修复错误:require'redis'

我正在使用雪豹。经过很多故障排除之后,我删除了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 

当我开始“轨服务器”和加载页面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' 

我已经通过这里和其他地方关于为什么需要声明可能会失败,但还没有找到,我已经明白,解释我的情况什么很多类似的问题,阅读。如果它是有帮助的,通过“宝石ENV”返回的宝石路径是:

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/ 

红宝石似乎是使用相同的路径:

~/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中的路径不包含任何宝石。

任何可以提供的洞察力是值得赞赏的。感谢您阅读这些。

回答

3

Bundler会禁用系统宝石,并且只会使Gemfile(及其依赖项)中列出的宝石可用于应用程序。这就是为什么你的应用程序需要的任何宝石应该在Gemfile中。

还值得注意的是,除非你不告诉它,否则bundler'需要'宝石。所以,一旦你告诉它使用Gemfile中的redis gem,你就不需要在应用程序的其他地方使用它。

+0

完美。谢谢。了解更多关于Bundler的信息:) – Scott 2011-03-03 13:54:47

相关问题