我有一个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
我不确定导致这种情况的原因是什么?
答案 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,并需要移动/重命名的其他操作