Почему добавление redis в Gemfile исправляет ошибку: require 'redis' - PullRequest
1 голос
/ 03 марта 2011

У меня возникла проблема при попытке использовать гем redis (2.1.1) с рельсами. Я исправил проблему, но не знаю, почему исправление работает, и хотел бы лучше понять.

Я использую 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" и загружаю страницу 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

Эта ошибка не возникает при использовании redis gem через irb.

~/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. Я не выполняю никаких других действий после изменения файла Gemfile по умолчанию, созданного «rails new myapp», я просто перезагружаю страницу, и она работает.

source 'http://rubygems.org'

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

Я прочитал много похожих вопросов здесь и в других местах о том, почему утверждение require может не сработать, но не нашел ничего, что я понял, чтобы объяснить мою ситуацию. В случае, если это полезно, пути gem 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/

Кажется, что 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 Ответ

3 голосов
/ 03 марта 2011

Bundler отключает системные гемы и делает доступными для приложения только те камни, которые перечислены в Gemfile (и их зависимостях). Вот почему любые драгоценные камни, которые требуются вашему приложению, должны быть в Gemfile.

Стоит также отметить, что упаковщик «требует» драгоценные камни для вас, если вы не скажете этого не делать. Итак, когда вы сказали ему использовать гем redis в Gemfile, вам больше не нужно его использовать в другом месте приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...