Я портирую приложение Rails 4 на Rails 5 и испытываю странное поведение с сильными параметрами и Rack::Test::UploadedFile
. У меня есть тест / контроллер, который делает что-то вроде этого:
# The test
post images_url, as: :json, params: {
image: {
image: Rack::Test::UploadedFile.new(foo)
}
}
# The controller
def image_params
params.require(:image).permit(:image)
end
В соответствии с документацией , только разрешенные скаляры проходят фильтр, и явный список типов включает Rack::Test::UploadedFile
. Пока все хорошо.
Кроме ... это не работает. Это отфильтровывается. Если я добавлю puts params
к контроллеру, я увижу что-то вроде {"image"=>{"image"=>{"original_filename"=>"test.jpg", "tempfile"=>"#<File:0x000056493a08dfc0>", "content_type"=>"image/jpeg"}}}
. Это хеш, а не UploadedFile
. Это подтверждается копанием в коде пакета действий: он заканчивается там как хеш, превращается в другой ActionController::Parameters
и не считается скаляром; таким образом, оно отфильтровывается.
Это хорошо работало в Rails 4 с таким тестовым кодом:
post :create, format: :json, image: {
image: Rack::Test::UploadedFile.new(foo)
}
Я не могу заставить это работать в Rails 5, я что-то упустил? Интересно, что если я уберу as: :json
, параметры будут выглядеть правильно (хотя мой контроллер не написан для обработки не-json, поэтому он не работает по другим причинам).