JSON запрос не разбирается на параметры - PullRequest
0 голосов
/ 29 января 2020

Проведя послеобеденный поиск в Google и тестирование, я убежден, что отсутствует кусок магии рельсов c, но не знаю, где он находится.

У меня есть тест, который повторяет ошибку, замеченную в production.

Rails 4.2.11.13

Использование гема protected_attributes (поэтому не проблема с сильными параметрами)

Я успешно отправил запрос json на контроллер api, но он только создает пустую версию параметра payment_allocation.

Контроллер ...

class Api::V1::PaymentAllocationsController < Api::ApiController
  def create
    p request.content_type
    p request.body.read
    p params
    p self._wrapper_options
  end
end 

Тело запроса, видимое в контроллере ...

"{\"amount\":123.33,\"transaction_type\":\"Transaction\",\"claim_number\":\"ABC-123\",\"resolved\":false,\"paid_on\":\"2000-01-01\"}"

Тип содержимого .... "application / json"

Полученный объект params ...

{"controller"=>"api/v1/payment_allocations", "action"=>"create", "payment_allocation"=>{}}

И я подтвердил, что все необходимые атрибуты доступны для параметров, используемых wrap_parameters

 <struct ActionController::ParamsWrapper::Options name="payment_allocation", 
format=[:json], 
include=["paid_on", "amount", "resolved", "claim_number", "transaction_type"], 
exclude=nil, klass=Api::V1::PaymentAllocationsController, 
model=PaymentAllocation(id: integer, paid_on: date, claim_number: string, transaction_type: string, amount: decimal, resolved: boolean)>

Инициализатор wrap_parameters выглядит так ...

# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end

# Disable root element in JSON by default.
ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = false
end

И я подтвердил, что инициализатор вызывается.

Так что wrap_parameters имеет правильные классы s, правильные атрибуты и т. д. c, но фактически не устанавливает значения параметров в payment_allocation.

Лучше всего предположить, что что-то не может разобрать строку json, но JSON .parse для приведенной выше строки возвращает это ...

{"amount"=>123.33, "transaction_type"=>"Transaction", "claim_number"=>"ABC-123", "resolved"=>false, "paid_on"=>"2000-01-01"}

Рад за любого подсказки.

(Кстати, у меня есть приложение с тем же кодом в той же версии rails, которое не имеет этой проблемы.)

1 Ответ

0 голосов
/ 29 января 2020

Обнаружил проблему, или, точнее, мой коллега.

Мы используем Rails LTS для поддержки некоторых наших старых приложений, и в файле application.rb есть настройка конфигурации для LTS.

Первоначально этот набор был задан как ...

config.rails_lts_options = {
  default: :hardened
}

Из документов LTS мы узнали, что одним из эффектов этого параметра является то, что он отключает синтаксический анализ JSON запросы в параметры.

Изменение настройки на ...

config.rails_lts_options = {
  default: :compatible
}

Включает синтаксический анализ JSON запросов в параметры, что естественно делает Rails. И все работает как хотелось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...