У меня возникла проблема при попытке использовать гем 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 не содержит никаких драгоценных камней.
Любое понимание, которое может быть предоставлено, приветствуется. Спасибо, что прочитали это далеко.