我正在尝试使用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
有谁知道如何解决这个问题?
谢谢
答案 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提交文件