Ruby on rails Activesupport/Multi-json:“动态支持”;未识别您的适配器规格“;

Ruby on rails Activesupport/Multi-json:“动态支持”;未识别您的适配器规格“;,ruby-on-rails,activesupport,Ruby On Rails,Activesupport,我有一个Ruby 1.9.3/Rails 3.1项目,文件中包含以下内容: gem 'rails', '3.1.12' gem 'json' gem 'multi_json', '1.7.7' 该版本的rails也将activesupport设置为3.1.12。我不确定问题的确切原因是什么,但在运行bundle exec rake test时,我得到了错误: /home/user/.gem/ruby/1.9.3/gems/multi_json-1.7.7/lib/multi_json.rb:1

我有一个Ruby 1.9.3/Rails 3.1项目,文件中包含以下内容:

gem 'rails', '3.1.12'
gem 'json'
gem 'multi_json', '1.7.7'
该版本的
rails
也将
activesupport
设置为3.1.12。我不确定问题的确切原因是什么,但在运行
bundle exec rake test
时,我得到了错误:

/home/user/.gem/ruby/1.9.3/gems/multi_json-1.7.7/lib/multi_json.rb:121:in 'rescue in load_adapter': Did not recognize your adapter specification. (ArgumentError)
...
(more stack trace, including activesupport methods)

幸运的是我找到了解决办法!见下文。

编辑:我的原始答案过时且不正确;请阅读,但请阅读底部的更新信息

在查看了大量其他问题后,如以下问题:



我还没有找到解决方案,所以我深入到库中,确定load_适配器正在接收参数“JSONGem”。别名失败,该方法尝试加载

/home/user/.gem/ruby/1.9.3/gems/multi_json-1.7.7/lib/multi_json/adapters/JSONGem.rb

此文件不存在,但
../json\u gem.rb
确实存在!因此,我对load adapter进行了如下修改:

def load_adapter(new_adapter)
    # puts "new_adapter: #{new_adapter}"                              # Debugging
    # puts "new_adapater.class: #{new_adapter.class}"                 # Debugging
    case new_adapter
    when String, Symbol
      new_adapter = ALIASES.fetch(new_adapter.to_s, new_adapter)
      new_adapter = "json_gem" if new_adapter =~ /^jsongem$/i         # I added this line
      # puts "final adapter: #{new_adapter}"                          # debugging
      require "multi_json/adapters/#{new_adapter}"
      klass_name = new_adapter.to_s.split('_').map(&:capitalize) * ''
      MultiJson::Adapters.const_get(klass_name)
    when NilClass, FalseClass
      load_adapter default_adapter
    when Class, Module
      new_adapter
    else
      raise NameError
    end
  rescue NameError, ::LoadError
   raise ArgumentError, 'Did not recognize your adapter specification.'
  end
这为我解决了问题。这可能不是一个最佳的解决方案(理想情况下,我会理解Alias.fetch失败的原因,如果确实发生了这种情况,并修复它),但是如果您的问题类似,那么希望这个快速修复可以有所帮助


更新

出于可部署性的原因,修改其他人的gem是不可行的。幸运的是,我找到了问题的根本原因。在
project\u root/config/initializers/security\u patches.rb
中,我们有一行

 ActiveSupport::JSON.backend = "JSONGem"
这是建议的解决方案。现在我们使用的是更新版本的rails(即>3.0),我们可以简单地将“JSONGem”替换为“json_gem”(这是我最初的修改所做的,以一种迂回的方式),而不必担心安全问题