2

Я боролся с этим весь день и, похоже, не могу понять решение.Carrierwave и Dropzone с вложенными атрибутами

В моем приложении, пользователь может создать свойство и загрузить много фотографий для этого свойства, как определено этими моделями:

Property.rb:

class Property < ActiveRecord::Base 
    belongs_to :user 

    has_many :attachments, dependent: :destroy 
    accepts_nested_attributes_for :attachments, allow_destroy: true 
end 

Attachment.rb:

class Attachment < ActiveRecord::Base   
    mount_uploader :photo, PhotoUploader 
    validates_presence_of :photo 

    belongs_to :property   
end 

Как вы можете видеть, приложение использует Carrierwave загрузки для до загружая изображение.

Это метод создания определенных в мой контроллер, очень простой:

properties_controller.rb

def create 
    @property = current_user.properties.build(property_params) 

    if @property.save 
     save_photos 
     flash[:notice] = "Your property has been created." 
     redirect_to @property 
    else 
     flash[:alert] = "Something went wrong." 
     render :new 
    end 
end 

и эти сильные параметры и сохранить фотографии методы:

def property_params 
    params.require(:property).permit(:name, :price, :address, :department, :type_id, :description, attachment_attributes: [:id, :property_id, :photo]) 
end 

def save_photos 
    # Create Each Uploaded Photo 
    params[:attachments]['photo'].each do |photo| 
     @attachments = @property.attachments.create!(:photo => photo) 
    end 
end 

На данный момент загрузка файлов работает так, не используя Dropzone. Однако, когда я хочу интегрировать Dropzone в свою форму, здесь возникает проблема.

Я добавил Dropzone класс к моей форме, с точки зрения:

_form.html.haml

= f.fields_for :attachments do |at| 
    = f.file_field :photo, :multiple => true, name: "attachments[photo][]" 

Теперь на моем файле конфигурации Dropzone:

properties.js

$(document).ready(function(){ 
    // disable auto discover 
    Dropzone.autoDiscover = false; 

    // grap our upload form by its id 
    $("#new_property").dropzone({ 
    // restrict image size to a maximum 1MB 
    maxFilesize: 5, 

    // changed the passed param to one accepted by our rails app 
    paramName: "attachments[photo]", 

    // show remove links on each image upload 
    addRemoveLinks: true, 
    dictDefaultMessage: "Arrastre sus fotos aqui.", 
    autoProcessQueue: false, 
    uploadMultiple: true, 
    parallelUploads: 5, 
    maxFiles: 5, 


    // The setting up of the dropzone 
    init: function() { 
     var myDropzone = this; 

     // First change the button to actually tell Dropzone to process the queue. 
     this.element.querySelector("button[type=submit]").addEventListener("click", function(e) { 
     // Make sure that the form isn't actually being sent. 
     e.preventDefault(); 
     e.stopPropagation(); 
     myDropzone.processQueue(); 
     }); 

     // Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead 
     // of the sending event because uploadMultiple is set to true. 
     this.on("sendingmultiple", function() { 
     // Gets triggered when the form is actually being sent. 
     // Hide the success button or the complete form. 
     }); 
     this.on("successmultiple", function(files, response) { 
     // Gets triggered when the files have successfully been sent. 
     // Redirect user or notify of success. 
     }); 
     this.on("errormultiple", function(files, response) { 
     // Gets triggered when there was an error sending the files. 
     // Maybe show form again, and notify user of error 
     }); 
    } 




    }); 
}); 

Этот код включает конфигурацию для работы с формой таким образом, что фотографии будут загружаться только после отправки всей формы, как описано в this tutorial.

Итак, как только dropzone реализован, я могу без проблем удалить файлы. Однако, когда я пытаюсь загрузить форму, кажется, что она не может распознать параметры файлов фотографий. Я получаю следующее сообщение об ошибке:

NoMethodError in PropertiesController#create undefined method `[]' for nil:NilClass on line: params[:attachments]['photo'].each do |photo|

Это кажется, что как только я добавить Dropzone, параметры просто исчезают и становятся нулевыми. Я попытался сыграть в атрибуте dropzone с атрибутом nameParam, но все это безрезультатно.

Помощь очень ценится ...

+0

да имяПарам исчез, независимо от того, что я меняю, я не вижу эффекта. Все, что я получил, было оригинальным файлом имениParam. – truongnm

+0

. Вы решили этот @Andres – truongnm

ответ

0

ERM .. Я знаю, что уже поздно, но у меня есть ответ на это.

ваше имя формы attachments[photo][] правый?

ваш Dropzone должен выглядеть следующим образом:

paramName: attachments[photo] 
uploadMultiple: true 

Решение здесь:

def save_photos 
    # Create Each Uploaded Photo 
    params[:attachments]['photo'].each do |photo| 
     @attachments = @property.attachments.create!(:photo => photo.pop) 
    end 
end 

Вам просто нужно вытолкнуть последнее значение массива, который содержит файлы. Так как в dropzone, когда вы добавляете uploadMultiple: true, выход будет [0, file1], [1, file2] and etc. Так photo.pop получит [file1] [file2] etc. и нажмите на базу данных.

+0

Привет Крис, но метод pop удаляет последний элемент в массиве и возвращает его. И что делать, это сохранить фотографию файла. нет? – rld

Смежные вопросы