Замена ActionDispatch :: ParamsParser после обновления до Rails 5 - PullRequest
0 голосов
/ 30 октября 2018

Перенос приложения из 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)

Направляющие рельса говорит:

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 голосов
/ 30 октября 2018

Вы должны извлечь существующие значения из parameter_parsers, изменить его в соответствии с вашими потребностями, а затем сбросить значения до ваших измененных значений. Из документации ActionDispatch :: Http :: Parameters :

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)

Вы можете найти дополнительную полезную информацию в этом ответе .

...