ArgumentError:尝试连接到redis时Hash的奇数个参数

时间:2013-09-11 17:33:10

标签: ruby-on-rails redis

我正在尝试按照this tutorial将rails连接到redis。 但是当我尝试$redis = Redis.new(:host => 'localhost', :port => 6379)甚至只是Redis.new时,我收到以下错误。我也试过了新的表示法(host: 'localhost',port: 6379)。 Redis工作(通过redis-cli传递进行ping-PONG测试)。

ArgumentError: odd number of arguments for Hash
    from /var/lib/gems/1.9.1/gems/redis-2.1.1/lib/redis.rb:65:in `[]'
    from /var/lib/gems/1.9.1/gems/redis-2.1.1/lib/redis.rb:65:in `info'
    from /var/lib/gems/1.9.1/gems/redis-2.1.1/lib/redis.rb:606:in `inspect'
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

我做错了什么?

Config Details:
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
$ rails -v
Rails 4.0.0

5 个答案:

答案 0 :(得分:7)

我使用redis gem 2.1.1版收到同样的错误。尝试将redis gem更新为最新版本,即版本3.0.4。

要更新redis gem,您可以运行

gem update redis

更新本地安装的版本,或运行

bundle update redis

更新作为Gemfile一部分安装的redis gem。

$ irb
1.9.3p392 :001 > require 'redis'
 => true 
1.9.3p392 :002 > Redis.new(:host => 'localhost', :port => 6379)
ArgumentError: odd number of arguments for Hash
from /Users/zachallett/.rvm/gems/ruby-1.9.3-p392/gems/redis-2.1.1/lib/redis.rb:65:in `[]'
from /Users/zachallett/.rvm/gems/ruby-1.9.3-p392/gems/redis-2.1.1/lib/redis.rb:65:in `info'
from /Users/zachallett/.rvm/gems/ruby-1.9.3-p392/gems/redis-2.1.1/lib/redis.rb:606:in `inspect'
from /Users/zachallett/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'

$ irb
1.9.3p392 :001 > require 'redis'
 => true 
1.9.3p392 :002 > Redis.new(:host => 'localhost', :port => 6379)
 => #<Redis client v3.0.4 for redis://localhost:6379/0> 

答案 1 :(得分:2)

出现以下问题,但我们无法将redis gem升级到3.x.事实证明,redis-rb正在寻找redis配置的键/值对,这在运行redis-server时并不存在。

使用配置文件

运行redis-server
redis-server /usr/local/etc/redis.conf

解决了这个问题。

答案 2 :(得分:1)

我还没有使用redis,但基于粗略的外观,似乎你正在使用redis-ruby库。您可能希望在可用时尝试使用redis-rails!(http://rubygems.org/gems/redis-rails

最简单的方法是,查找Gemfile,并删除有关redis gem的信息。将该行替换为:

gem 'redis-rails'

保存文件,然后运行:

$ bundle install

答案 3 :(得分:0)

我遇到了同样的问题,结果homebrew已将我的redis-server从2.6.x更新为2.8.6

我恢复了旧版本的redis,它确实有效!

答案 4 :(得分:0)

我遇到了同样的错误。我注意到的第一件事是这个错误与视觉输出有关,它在控制台中显示为对象的表示。 inspect方法就是为此目的而调用的方法。请参阅堆栈跟踪中的以下内容:

/var/lib/gems/1.9.1/gems/redis-2.1.1/lib/redis.rb:606:in 'inspect'

所以,如果你做redis = Redis.new(:host => 'localhost', :port => 6379) 或者只要你输入redis之后的任何时候,你就会收到这个错误。但是如果你忽略它就行了 redis.get 'foo'一切正常。