我正在尝试在API端点上发送一个文件。我正在使用强参数验证输入,所以我有:
def postParams
ActionController::Parameters.new(params).permit(:foo, :bar, :cv_file)
end
params do
requires :foo, allow_blank: false, type: String
requires :bar, allow_blank: false, type: String
requires :cv_file, :type => Rack::Multipart::UploadedFile
end
结果是Unpermitted parameter: cv_file
。
如果我将cv_file
的类型更改为字符串将起作用,但Rack::Multipart::UploadedFile
类型不接受。
我错过了什么吗?也许是标题?
更新
正如我所看到的那样,我的邮递员遇到了一些问题,所以我现在用curl进行调用,然后回到“未经许可的参数:cv_file'。
我发现出现此问题的原因是文件如下:
<Hashie::Mash filename="CV 2017 June.pdf" head="Content-Disposition: form-data; name=\"cv_file\"; filename=\"CV 2017 June.pdf\"\r\nContent-Type: application/octet-stream\r\n" name="cv_file" tempfile=#<Tempfile:/tmp/RackMultipart20170614-11-1vhzirn.pdf> type="application/octet-stream">
而不是"cv_file"=>#<ActionDispatch::Http::UploadedFile ....
。
有什么想法吗?
更新2
我找到了一个解决方案,但我认为这不是最好的方法,但您可以通过这种解决方案更好地理解问题:
def postParams
local_param = params.dup
upload = ActionDispatch::Http::UploadedFile.new(
tempfile: params[:csv][:tempfile],
filename: params[:csv][:filename],
type: params[:csv][:type],
headers: params[:csv][:head],
)
local_param[:csv] = upload
ActionController::Parameters.new(local_param).permit(:foo, :bar, :cv_file)
end
desc "Create new candidate"
params do
requires :foo, allow_blank: false, type: String
requires :bar, allow_blank: false, type: String
optional :cv_file,:type => File
end
post 'new' do
post_params = postParams
if(post_params[:candidate_cv])
# Process the CV file
post_params.delete :candidate_cv
end
Candidate.create!(post_params)
end