Carrierwave,Dropzone.js Rails 4,参数很强

时间:2014-04-10 17:13:12

标签: ruby-on-rails-4 carrierwave strong-parameters dropzone.js

我正在尝试使用Carrierwave和Dropzone.js上传多个图像,但是当我提交表单时出现以下错误。

请注意,没有dropzone.js的相同表单工作正常,这意味着我只是使用HTML5上传多个图像。

请参阅下面我提交表单时创建的哈希(通过ajax使用dropzone)


" project_images_attributes" = GT; [{"图像&#34 =

  

[#,@ original_filename =" artist4.jpg",@ content_type =" image / jpeg",@ headers =" Content-Disposition:form-data;命名= \"项目[project_   images_attributes] [] [图像] [] \&#34 ;; filename = \" artist4.jpg \" \ r \ nContent-Type:image / jpeg \ r \ n">,#,@ original_filename =" feed1.jpg" ,@ con   tent_type =" image / jpeg",@ headers =" Content-Disposition:form-data;命名= \"项目[project_images_attributes] [] [图像] [] \&#34 ;;文件名= \" feed1.jpg \" \   r \ nContent-Type:image / jpeg \ r \ n">,#,@ original_filename =" gallery1.jpg",@ content_type =" image / jpeg",@标题="内容处置:   形式数据;命名= \"项目[project_images_attributes] [] [图像] [] \&#34 ;; filename = \" gallery1.jpg \" \ r \ nConContent-Type:image / jpeg \ r \ n">]}]},"项目视频   o" => [""],"提交" =>"创建项目"}

未经许可的参数:图片

请注意我已将控制器中的图像参数列入白名单,并且使用HTML 5但不使用ajax和dropzone.js

有谁知道如何解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:0)

将我最终结果安排在上下文中的代码:

  private
  def pin_image_params
    #params.require(:pin_image).permit(:photo) (not permitted)
    #params.require(:pin_image).permit(photo: [:'0']) (permitted but action handler error)
    #params.require(:pin_image)["photo"].values.first (stringify_keys error)
    params.require(:photos).values
  end

强大的参数不断返回未经许可的参数:照片。看着控制台,我看到了参数被编号,而我能够访问它们的唯一方法就是按数字潜入。尽管如此,尝试将它们直接传递给create返回错误。这是因为模型无法理解编号哈希的格式。知道它需要迭代每个附加的图像是不够聪明的。所以:

def create
   # so pin_image_params is an array of files basically
   @pin_images = pin_image_params.inject([]) do |memo, photo|
   # this pattern will store the memo into the @pin_images reference
      memo << PinImage.create(photo: photo)
   # keying it explicitly
   end
   if @pin_images.present?
      render json: { id: @pin_images.map(&:id) }, :status => 200
   else
      #  you need to send an error header, otherwise Dropzone
      #  will not interpret the response as an error:
      render json: { error: @pin_images.errors.full_messages.join(',')}, :status => 400
   end
end

我的控制器返回一个id列表,并在拥有PinImage(Pin)的模型的隐藏字段中捕获这些ID。 (这是通过ajax成功回调完成的,通过dropzone提交PinImages。)因此,当提交主模型时,我还必须处理那里的关联,但我发现我更喜欢通过nested_attributes_for混淆。 YMMV。

答案 1 :(得分:0)

查看您提交表单的方式。是form.submit吗?上传完成后,Dropzone会自动通过ajax提交文件