【问题标题】:Rails 5 strong parameters doesn't allow UploadedFileRails 5 强参数不允许 UploadedFile
【发布时间】: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


【解决方案1】:

选项as: :json 导致所有请求参数为serialized using their to_json methods。这就是为什么您获取的是哈希而不是 Rack::Test::UploadedFile 对象。

遗憾的是,编码器无法将 UploadedFile 类识别为任何不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多