Activesupport / Multi json:“无法识别您的适配器规范”
我有一个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)
幸运的是我找到了解决方案! 见下文。
编辑 :我的原始答案已过时且不正确; 如果您愿意,请阅读,但请阅读底部的更新信息 。
在查看了大量其他问题后,例如:
OmniAuth登录Twitter – “无法识别您的适配器规范。” 错误
Capistrano部署:在资产期间“未识别您的适配器规范”:预编译
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"
这是旧版rails中安全漏洞的推荐修复。 既然我们使用的是较新版本的rails(即> 3.0),我们可以简单地将“JSONGem”替换为“json_gem”(这是我原来的修改所做的,以迂回的方式)而不用担心安全问题。
- 覆盖ActiveSupport :: Concern模块中的方法,这些方法由同一模块中的类方法定义
- 如何从过时的TZInfo标识符中获取Rails TimeZone名称?
- ActiveSupport中mattr_accessor和cattr_accessor之间的区别?
- rails activesupport通知 – 错误的db运行时值
- btw const_get和qualified_const_get有什么区别?
- 测试使用ActiveRecord的问题/模块
- 将Date对象转换为TimeWithZone
- 如何将TZInfo标识符转换为Rails TimeZone名称/密钥
- 我需要做什么才能让Hash.from_xml()工作?