Ruby on rails Rails强参数Rack::Multipart::UploadedFile的未授权参数
我正试图在我的API端点上发送一个文件。我正在使用强参数验证输入,因此:Ruby on rails Rails强参数Rack::Multipart::UploadedFile的未授权参数,ruby-on-rails,strong-parameters,grape,Ruby On Rails,Strong Parameters,Grape,我正试图在我的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
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
结果是未允许的参数:cv_file
如果我将cv_文件
的类型更改为字符串,则可以使用,但Rack::Multipart::UploadedFile的类型不接受
我错过什么了吗?也许是头球
更新
正如我看到的,我的邮递员有一些问题,所以我现在用curl打电话,回到“unpermittedparameter: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">
是的,您需要内容类型的multipart/form data
标题。你是怎么发送的?嗨@Iceman,我试过了,但是我得到了Rack::QueryParser::InvalidParameterError(无效的%-编码(“foo”)….
但我看到了那里的文件。我和邮递员一起发送,也许这是相关的。卷曲度似乎不同,我没有得到Rack::QueryParser::InvalidParameterError
,但我回到了Unpermitted parameter:cv_file
。唯一的办法是不使用postParams
方法,我有这个文件。
。我找不到使用强参数的方法。您应该使用此信息来回答问题,以增加回答的机会,我恐怕这不是我在Rails方面的强项。
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