Rails Strong参数Rack :: Multipart :: UploadedFile

时间:2017-06-14 14:26:31

标签: 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 :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.pd‌​f> 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

0 个答案:

没有答案