首页 > 解决方案 > 在 Ruby 1.8.7 中,为什么 IRB 中的 JSON 语法会引发语法,但在 Rails 3.2.22.1 控制台中却没有?

问题描述

我负责维护一个遗留的 Ruby on Rails 应用程序,我目前正在 Ruby v1.8.7 (2013-12-22 patchlevel 375) 上对其进行测试。该应用程序使用 Rails v3.2.22.1(Rails LTS提供的 Rails 版本)。我遇到了一个奇怪的语法问题。

在普通 IRB 控制台中,Hash 的哈希火箭语法按预期工作,而 JSON 语法按预期引发语法错误。但是,在 Rails 控制台中,JSON 语法工作得很好,我不知道为什么它没有引发语法错误。

任何想法下面的代码中发生了什么?

# in Bash
$ ruby -v
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin18.2.0]

# in Rails console
Loading development environment (Rails 3.2.22.1)
irb(main):001:0> system "ruby -v"
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin18.2.0]
=> true
irb(main):002:0> {a: 1} # JSON syntax doesn't trigger SyntaxError
=> {:a=>1} 
# loading vanilla IRB *()
irb(main):003:0> system "irb" # loading vanilla IRB

# in vanilla IRB (via Rails console, if that matters)
irb(main):001:0> system "ruby -v"
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin18.2.0]
=> true
irb(main):002:0> {a: 1} # expected syntax error
SyntaxError: compile error
(irb):2: odd number list for Hash
{a: 1}
   ^
(irb):2: syntax error, unexpected ':', expecting '}'
{a: 1}
   ^
  from (irb):2

标签: ruby-on-rails-3ruby-1.8.7

解决方案


原来在 Ruby 中设置的 Ruby 版本.ruby-version是 1.9.3-p551,这导致 Rails 使用 Ruby 1.9.3-p551 加载。当我从系统中获得 Ruby 版本时,这并不是很明显,但是从应用程序中检查 Ruby 版本会发现差异。

$ bundle exec rails console
irb(main):001:0> system "ruby -v"
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin18.2.0]
=> true
irb(main):002:0> RUBY_VERSION
=> "1.9.3"

推荐阅读