如何通过初始化器重写JSON.parse方法?(Ruby JSON gem 1.8.6)
解决JSON 1.8.6模块方法重写不生效的问题
你的问题核心是没搞对JSON模块方法的定义方式:JSON 1.8.6里的parse是模块方法(即类方法),而你之前的写法定义的是模块内的实例方法,自然不会覆盖原方法。
正确的重写方式
直接定义模块方法(用self.parse),两种写法都可以:
写法一:直接在JSON模块内定义
# ./config/initializers/json.rb module JSON def self.parse(source, opts = {}) Parser.new(source, **opts).parse end end
写法二:用module_eval定义
# ./config/initializers/json.rb JSON.module_eval do def self.parse(source, opts = {}) Parser.new(source, **opts).parse end end
额外保障:强制移除原方法再重定义
如果担心原方法优先级问题,可以先移除原方法再重新定义,确保覆盖:
module JSON # 先移除原模块方法(如果存在) remove_method :parse if respond_to?(:parse) def self.parse(source, opts = {}) Parser.new(source, **opts).parse end end
验证是否生效
启动Rails控制台,执行以下命令查看方法来源:
JSON.method(:parse).source_location
如果输出指向你的./config/initializers/json.rb,说明重写成功;如果还是指向gem目录,检查初始化器是否被正确加载(重启Rails服务再试)。
内容的提问来源于stack exchange,提问作者Ruby Racer
相关产品推荐
相关产品推荐

