【问题标题】:ArgumentError: odd number of arguments for Hash when trying to connect to redisArgumentError:尝试连接到redis时Hash的奇数个参数
【发布时间】:2016-08-28 04:51:26
【问题描述】:

我正在尝试通过关注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

【问题讨论】:

  • 奇怪 - 在我看来没有任何问题。当您使用默认值时,您甚至不需要这些参数。控制台中的 $redis = Redis.new() 会给你什么错误?

标签: ruby-on-rails redis


【解决方案1】:

我在使用 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> 

【讨论】:

  • 我进行了更新,但没有成功。 (同时,我还使用 rvm 更新了 ruby​​ 版本)。但这似乎很有趣: 2.0.0-p247 :003 > require 'redis' => false
  • 谢谢!我曾尝试过 gem 更新,但后来它与捆绑更新/安装一起工作!
  • 如果 OP 需要 redis gem 2.x,那么升级到 2.2.x 应该也可以。
【解决方案2】:

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

使用配置文件运行 redis-server

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

修复了问题。

【讨论】:

    【解决方案3】:

    我还没有使用过redis,但粗略的看了一下,好像你正在使用redis-ruby 库。你可能想在 redis-rails 可用时尝试它!(http://rubygems.org/gems/redis-rails)

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

    gem 'redis-rails'
    

    保存文件,然后运行:

    $ bundle install
    

    【讨论】:

    • 我只能使用 redis。但这可能会奏效。
    • 这是误导。仅当您想将 Redis 用作缓存或会话存储时,redis-rails 才有意义。除此之外,没有什么可以与特定框架集成。
    【解决方案4】:

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

    我恢复到旧版本的 redis 并且它工作正常!

    【讨论】:

    • 我强烈推荐使用 2.8。另外,将你的 redis gem 更新到 2.2.x 就可以了。
    【解决方案5】:

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

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

    所以如果你这样做redis = Redis.new(:host =&gt; 'localhost', :port =&gt; 6379) 或者任何时候你只输入redis therafter,你都会得到这个错误。但是,如果您忽略它而只是做 redis.get 'foo' 一切正常。

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2017-07-12
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多