Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中将我的dropzone文件与我的用户表链接_Ruby On Rails_Dropzone.js - Fatal编程技术网

Ruby on rails 在rails中将我的dropzone文件与我的用户表链接

Ruby on rails 在rails中将我的dropzone文件与我的用户表链接,ruby-on-rails,dropzone.js,Ruby On Rails,Dropzone.js,因此,在对我的代码进行了100多次修改之后,我终于让dropzone正常工作了 现在的问题是,我有一个列表表和一个照片表。 将有一个表单,用户将创建一个列表,在该表单内将有一个dropzone来放置您的图像 我想要的是,我应该能够以某种方式将这些图像与我当前的列表关联起来 所以dropzone的问题是,当你删除一个图像时,它会点击post操作并在数据库中插入一个条目,因为那时列表表单提交按钮还没有点击,所以我没有任何列表id来创建图像和列表之间的关联 解决这个问题的一个方法是设置 autoPro

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

现在的问题是,我有一个列表表和一个照片表。 将有一个表单,用户将创建一个列表,在该表单内将有一个dropzone来放置您的图像

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

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

解决这个问题的一个方法是设置

autoProcessQueue:false
然后在提交时将其设置为true

但即使这样,它也不起作用

谁能帮帮我吗

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

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

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

/Listing.rb/

类列表
/Photo.rb/

class-Photo

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

为什么不为用户创建一个表,为图像创建一个表,为保存的每个用户创建一个关系!这样每个用户都有许多图像。你可以用很多的和生下来的。对不起,有语法错误,我的母语是葡萄牙语

table users
id | name
1  | Josh
2  | Pedro

table images
id | user_id
1  | 1
2  | 1
3  | 1
4  | 2

在这种情况下,您可以使用远程表单保存列表,远程表单将使用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
在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);
   });
 });
 mediaDropzone.processQueue();
为了简短起见,我们保存列表,在回调中保存照片并将两者关联起来


您可以在这里查看repo的formsubmit分支中的示例

我没有时间写完整的答案,但是您需要将listing.id从rails传递到javascript post请求,然后返回rails以分配给listing_id(例如,通过将post url从“listings”更改为“listings/id_number”)。如果这不起作用,以后将尝试提供更好的信息。但首先检查rails控制器,查看是否已将listing_id与post请求一起传递——如果已传递,您只需添加类似于
@photo.listing_id=params[:listing_id]
的内容,然后
@photo.save
。Joseph,如果我尝试您的方法,如果我上传多个图像会发生什么情况。在这种情况下,会创建多个列表,因为这不是我想要的。因为一个列表最多可以有4个与之关联的图像。所以在这种情况下,列表表将有一个条目,照片表将有4个条目具有相同的列表id。这在当前代码中是可能的。是的,我看到了。很抱歉,我之前只有几分钟的时间发表评论,没有考虑整个工作流程。不过,看起来你在下面得到了一个很好的答案!您也可以编辑create方法,首先检查列表是否存在,如果不存在,则只创建一个新列表。这正是我所寻找的。非常适合我。非常感谢。
table users
id | name
1  | Josh
2  | Pedro

table images
id | user_id
1  | 1
2  | 1
3  | 1
4  | 2
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
 $(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);
   });
 });
 mediaDropzone.processQueue();