我有一个Ruby 1.9.3 / Rails 3.1项目,在gemfile中有以下内容:
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)
幸运的是我找到了解决方案!见下文。
答案 0 :(得分:0)
修改:我的原始答案已过时且不正确;如果您愿意,请阅读,但请阅读底部的更新信息。
在查看了大量其他问题之后:
OmniAuth Login With Twitter - "Did not recognize your adapter specification." Error
Capistrano deploy: "Did not recognize your adapter specification" during assets:precompile
https://github.com/intridea/multi_json/issues/132
我没有找到解决方案,所以我潜入了库并确定load_adapter正在接收参数“JSONGem”。别名失败,该方法尝试加载
/home/user/.gem/ruby/1.9.3/gems/multi_json-1.7.7/lib/multi_json/adapters/JSONGem.rb
此文件不存在,但.../json_gem.rb
确实存在!所以我按如下方式修改了加载适配器:
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
这解决了我的问题。它可能不是最佳解决方案(理想情况下我会理解为什么ALIASES.fetch失败,如果确实发生了什么,并修复了),但如果你的问题类似,那么希望这个快速解决方案可以提供帮助。
<强>更新强>
由于可部署性原因,修改其他人的gem是不可行的。幸运的是,我找到了问题的根本原因。在project_root/config/initializers/security_patches.rb
中,我们有了
ActiveSupport::JSON.backend = "JSONGem"
这是对security bug in older versions of rails的推荐修复。既然我们使用的是较新版本的rails(即&gt; 3.0),我们可以简单地将“JSONGem”替换为“json_gem”(这是我原来的修改所做的,以环形方式进行)而不用担心安全性问题。