文件上传无照片参数问题

时间:2014-06-24 16:52:31

标签: javascript jquery ruby-on-rails ruby file

我有一个rails 4 app,我使用jQuery File Upload向Carrierwave发送请求。我的代码如下:

<input name='photo[image]' type='file' data-url='photos/create' multiple="true" class='fileupload'/>

和我的jquery:

$('.fileupload').fileupload({
    dataType: 'json',
    done: function (e, data) {
      $.each(data.result.files, function (index, file) {
        alert(file.name);
      });
    }
});

和我在照片控制器中的创建动作:

def create
@photo = Photo.new(photo_params)

respond_to do |format|
  if @photo.save
    format.json { render json: @photo }
  else
    format.json { render json: @photo.errors, status: :unprocessable_entity }
  end
end
end

private
   def photo_params
     params.require(:photo).permit!
   end

和我的照片模型:

class Photo < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

当我创建照片时,carrierwave正确地创建了一个图像(在public / uploads目录中),但由于某种原因,我的jQuery出现了错误:

Uncaught TypeError: Cannot read property 'length' of undefined

我不确定导致这种情况的原因是什么?

4 个答案:

答案 0 :(得分:2)

我应该将此作为评论,但我没有足够的声誉,所以我道歉。

我认为你只需要使用data.files而不是data.result.files

像这样

$('.fileupload').fileupload({
    dataType: 'json',
    done: function (e, data) {
      $.each(data.files, function (index, file) {
        alert(file.name);
      });
    }
});

答案 1 :(得分:1)

在我看来,你回复的json没有done回调所期望的结构。由于它在each上调用data.result.files,我认为响应的结构需要更像这样:

render json: {result: { files: [@photo] } }

您还可以尝试通过将其记录到回调

中的javascript控制台来调试返回的数据

done: function(e, data) { console.log(data) }

答案 2 :(得分:1)

data对象的结构将results字段参数显示为包含与文件无关的各种字段的对象;因此data.result.files会导致错误.each()

使用以下内容:

$.each(data.files, function (index, file) {
   alert(file.name);
});

Working Demo (删除服务器端代码以捕获Object,只需修改上面的代码。)

答案 3 :(得分:0)

首先 - 尝试探索你的参数。 文件可以作为临时文件保存到tmp,并需要移动/重命名的其他操作