【发布时间】:2019-09-17 02:45:12
【问题描述】:
我正在将 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
根据documentation,只允许标量通过过滤器,明确的类型列表包括Rack::Test::UploadedFile。到目前为止,一切顺利。
除了...它不起作用。它被过滤掉了。如果我将puts params 添加到控制器,我会看到类似{"image"=>{"image"=>{"original_filename"=>"test.jpg", "tempfile"=>"#<File:0x000056493a08dfc0>", "content_type"=>"image/jpeg"}}} 的内容。这是一个哈希,而不是 UploadedFile。深入挖掘 actionpack 代码也证实了这一点:它最终成为一个哈希,变成另一个 ActionController::Parameters,并且不被视为标量;它因此被过滤掉了。
这在 Rails 4 中运行良好,测试代码如下:
post :create, format: :json, image: {
image: Rack::Test::UploadedFile.new(foo)
}
我似乎无法在 Rails 5 中使用它,我错过了什么吗?有趣的是,如果我删除 as: :json 参数看起来是正确的(尽管我的控制器不是为处理非 json 而编写的,因此它因其他原因而失败)。
【问题讨论】:
-
对于图片,contentType 必须是 'form-data' 而不是 JSON。
标签: ruby ruby-on-rails-5