2011-03-03 2 views
1

레일이있는 redis (2.1.1) gem을 사용하는 데 문제가있었습니다. 문제를 해결했지만 해결 방법이 왜 효과가 있고 더 잘 이해하고 싶은지 잘 모르겠습니다.Gemfile에 redis를 추가하면 왜 오류가 수정됩니까? 'redis'가 필요합니다.

스노우 레오파드를 사용하고 있습니다. 많은 문제를 해결 한 후에 Ruby, Rails 및 RubyGems 버전을 제거한 다음 MacPorts를 사용하여 Ruby 1.8.7 패치 레벨 334 및 RubyGems 1.6.0을 설치했습니다. Rails는 이제 3.0.5 버전의 새로운 설치입니다. "which -a"를 사용하면 경로에 하나의 버전의 루비와 보석 만 있음을 알 수 있습니다.

나는 새로운 레일 응용 프로그램을 만들고 다음 코드를 사용하여 간단한 컨트롤러를 추가 :

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)> 

내 레일 앱에서이 문제를 해결할 수있는 유일한 방법은 Gemfile에 redis를 추가하는 것입니다. "rails new myapp"로 만든 기본 Gemfile 파일을 변경 한 후에 다른 작업을 수행하지 않습니다. 페이지를 다시로드하기 만하면 작동합니다.

source 'http://rubygems.org' 

gem 'rails', '3.0.5' 
gem 'sqlite3' 
gem 'redis' 

내가 여기와 다른 곳은 문이 실패 할 수 있습니다 필요로하지만 내 상황을 설명하는 것으로 이해 한 아무것도 발견하지 않은 이유에 대해 많은 유사한 질문을 읽었습니다. 경우는 도움이된다 "보석 ENV"에 의해 반환 된 보석 경로는 다음과 같습니다 나는 두 개의 경로가 다른 순서에있는 것을 알 수

~/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 

:

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/ 

루비는 동일한 경로를 사용하고있는 것으로 나타납니다 ,/Users의 경로에는 젬이 포함되어 있지 않습니다.

제공 할 수있는 통찰력은 인정됩니다. 지금까지 읽어 주셔서 감사드립니다.

답변

3

Bundler는 시스템 보석을 비활성화하고 Gemfile에 나열된 보석 (및 해당 종속 항목) 만 앱에서 사용할 수 있도록합니다. 그래서 앱에 필요한 보석은 모두 Gemfile에 있어야합니다.

당신이하지 말라고하지 않는 한 bundler는 '보석'이 필요합니다. 그래서, 당신이 Gemfile에서 redis gem을 사용하도록 말하면 app 내의 다른 곳에서 그것을 요구하지 않아도됩니다.

+0

Perfect. 감사. Bundler에 대해 자세히 알아 보려면 끄기 :) – Scott