升级到Rails 5后替换ActionDispatch :: ParamsParser

时间:2018-10-29 22:39:08

标签: ruby-on-rails ruby actiondispatch

将应用程序从Rails 4.2.9迁移到5.2.1。

这是最新一期:

$ rails console
/Users/meltemi/rails/myapp/config/initializers/disable_xml_params.rb:3:in `<top (required)>': uninitialized constant ActionDispatch::ParamsParser (NameError)
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:657:in `block in load_config_initializer'
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:170:in `instrument'
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:656:in `load_config_initializer'

初始化程序中令人反感的代码行:

# config/initializers/disable_xml_params.rb
ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::XML)

Rails Guides说:

  

ActionDispatch :: ParamsParser已过时,并已从中间件堆栈中删除。要配置参数解析器,请使用ActionDispatch :: Request.parameter_parsers =。 (提交,提交)

所以我尝试了以下方法:

ActionDispatch::Request.parameter_parsers.delete(Mime::XML)

但这会引发更多错误:

$ rails console
/Users/meltemi/rails/myapp/config/initializers/disable_xml_params.rb:3:in `<top (required)>': uninitialized constant Mime::XML (NameError)
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:657:in `block in load_config_initializer'
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/activesupport-5.2.1/lib/active_support/notifications.rb:170:in `instrument'
    from /Users/meltemi/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-5.2.1/lib/rails/engine.rb:656:in `load_config_initializer'

是否有更好的方法在该对象上调用.delete?

1 个答案:

答案 0 :(得分:2)

您必须从parameter_parsers获取现有值,对其进行修改以适合您的需要,然后将这些值重置为修改后的值。来自ActionDispatch::Http::Parameters documentation

  

parameter_parsers=(parsers)

     

为给定的MIME类型配置参数解析器。

     

它接受一个散列,其中的键是MIME类型的符号,而值是proc。

original_parsers = ActionDispatch::Request.parameter_parsers
xml_parser = -> (raw_post) { Hash.from_xml(raw_post) || {} }
new_parsers = original_parsers.merge(xml: xml_parser)
ActionDispatch::Request.parameter_parsers = new_parsers

在特定情况下,您应该查看original_parsers中的解析器,以查看是否有任何要删除的内容。在我方便查看的简单Rails 5应用程序上,我仅有的值是:

=> {
    :json => #<Proc:0x00007fe818fc6fb8@/Users/foo/.rvm/gems/ruby-2.6.0-preview2/gems/actionpack-5.2.1/lib/action_dispatch/http/parameters.rb:11 (lambda)>
}

您的应用程序的配置可能有所不同,但是要回答有关如何删除值的问题,此简单版本应该可以工作:

ActionDispatch::Request.parameter_parsers = ActionDispatch::Request.parameter_parsers.except(:json)

您可能会找到其他有用的信息in this answer