Проведя послеобеденный поиск в 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, которое не имеет этой проблемы.)