将我的dropzone文件与rails中的users表链接



因此,在对我的代码进行了100多次修改之后,我终于让dropzone正常工作了。

现在的问题是,我有一个列表表和一个照片表。将会有一个表单,用户将在其中创建一个列表,并且在该表单中会有一个放置区域来放置您的图像。

我想要的是,以某种方式,我应该能够将这些图像与我当前的列表相关联。

因此,dropzone的问题是,当你放下一个图像时,它会点击post操作并在数据库中插入一个条目,因为到那时还没有点击列表表单提交按钮,所以我没有任何列表id来创建图像和列表之间的关联。

我可以解决这个问题的一种方法是设置

autoProcessQueue:false

然后在提交时将其设置为true。

但即便如此,它也不起作用。

有人能帮帮我吗。

我使用carrierwave和cloudinary进行文件上传,使用dropzone.js进行高级UI。

以下是所有代码:/new.html.erb/

<%=form_for @listing, :html=> { class:'ui form centered black segment'} do |f|%>
<div class="required field">
<label>Title</label>  
<%=f.text_field :title,placeholder:'Title of the listing'%>
</div>
<div class="field ui segment dropzone dropzone-previews" id='my-dropzone'>
<p class="dz-message">You can drop an image here or click to upload."
</p>
</div>
<script type="text/javascript">
Dropzone.autoDiscover=false;
var myDropzone=new Dropzone("#my-dropzone",
{
autoProcessQueue:false,
url:'/listings',
paramName:"file",
addRemoveLinks:true,
previewsContainer:'.dropzone-previews',
headers: 
{
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}

});
$('.ui.submit').click(function(e){
myDropzone.autoProcessQueue();
});
</script>
<%end%>

在我的列表控制器中,我正试图做这样的事情。这就是我试图让它发挥作用的原因,但我需要有人建议我一个更好的方法,

/列出控制器/

def create
@listing=Listing.create(listing_params)
@photo=@listing.photos.create(file_name: params[:file])
redirect_to root_url
end

即使这不适用于任何上传的图像,它也设置了列表id,但图像文件名仍然为空。

/Listing.rb/

class Listing < ActiveRecord::Base
has_many :photos
end

/照片.rb/

class Photo < ActiveRecord::Base
mount_uploader :file_name, PhotoUploader
belongs_to :listing
end
/*------------------Photos schema---------------------*/
id   |    file_name  |  listing_id

我应该怎么做才能在上传的图片和列表之间创建某种链接。

在这种情况下,您可以使用远程表单保存列表,远程表单将使用ajax而不是常规机制提交表单。在列表保存后的创建操作中,将id存储在会话变量中。在create.js.erb中,您可以使用myDropzone.processQueue()函数处理照片。当照片在控制器操作中被处理时,将其绑定到会话变量的列表并保存

class ListingsController < ApplicationController 
def create
@listing = Listing.new(listing_params)
if @listing.save
session[:listing] = @listing.id
respond_to do |format|
format.js
end
end
end
def media
@listing = Listing.find(session[:listing])
@media = Media.new(file_name: params[:file], listing: @listing)
if @media.save!
respond_to do |format|
format.json{ render :json => @media }
end
end
end
end

使用javascript以编程方式创建Dropzone,然后在Create.js.erb 中引用变量

$(document).ready(function(){
Dropzone.options.mediaDropzone = false;
mediaDropzone = new Dropzone('div#media-dropzone', { 
url: "/listings/media",
autoProcessQueue: false
});
mediaDropzone.on("success", function(file, responseText) {
console.log(responseText.file_name.url);
console.log(responseText);
});
});

在create.js.erb 中

mediaDropzone.processQueue();

简而言之,我们保存列表,并在回调中保存照片并将两者关联起来。

您可以在此处查看回购的formsubmit分支中的示例https://github.com/sudharti/dropzone-rails-demo/tree/formsubmit

为什么不为用户创建一个表,为图像创建一个表格,为保存的每个用户创建一种关系!因此每个用户都有许多图像。可以使用has_many和beglons_to。很抱歉有语法错误,我的母语是葡萄牙语。

table users
id | name
1  | Josh
2  | Pedro
table images
id | user_id
1  | 1
2  | 1
3  | 1
4  | 2

最新更新