首页 文章

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

提问于
浏览
2

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

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

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


“project_images_attributes”=> [{ “图像”=

[#,@ original_filename =“artist4.jpg”,@ content_type =“image / jpeg”,@ headers =“Content-Disposition:form-data; name = \”project [project_ images_attributes] [] [image] [] \“; filename = \”artist4.jpg \“\ r \ nContent-Type:image / jpeg \ r \ n”>,#,@ original_filename =“feed1.jpg”,@ con tent_type =“image / jpeg”, @ headers =“Content-Disposition:form-data; name = \”project [project_images_attributes] [] [image] [] \“; filename = \”feed1.jpg \“\ r \ nConContent-Type:image / jpeg \ r \ n“>,#,@ original_filename =”gallery1.jpg“,@ content_type =”image / jpeg“,@ headers =”Content-Disposition:form-data; name = \“project [project_images_attributes] [] [image ] [] \“; filename = \”gallery1.jpg \“\ r \ nContent-Type:image / jpeg \ r \ n”>]}]},“project-vide o”=> [“”],“ commit“=>”创建项目“}

Unpermitted parameters: image

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

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

谢谢

2 回答

  • 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)的模型的隐藏字段中捕获 . (这是通过ajax成功回调完成的,通过dropzone提交PinImages . )因此,当提交主模型时,我还必须处理那里的关联,但我发现我更喜欢通过nested_attributes_for混淆 . 因人而异 .

  • 0

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

相关问题