ruby-on-rails-3 - 在 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 中设置的 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"
推荐阅读
- python - (Python)对两个链表求和,其中每个节点都是一个整数。属性错误
- vert.x - Vert.x 3.9 WebClient 中的超时未按预期工作
- python-3.x - 定义字体以在 python fpdf 中重用
- html - 无法为有图片和文字标签
- java - keytool 错误:java.security.ProviderException:库/opt/safenet/protecttoolkit5/ptk/lib/libcryptoki.so 不存在
- javascript - 如何使用 json 文件中的数据移动多个 div
- json - Json 属性未按 Postgres 的顺序排列
- postgresql - 如何仅访问虚拟视图并使用standalone-vdb.xml wildfly/Teiid 域隐藏物理表
- teamcity - 如何将当前日期添加到工件路径中
- apache-spark - 使用 spark-submit 加载 csv 文件时出错