Я боролся с этим весь день и, похоже, не могу понять решение.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, но все это безрезультатно.
Помощь очень ценится ...
да имяПарам исчез, независимо от того, что я меняю, я не вижу эффекта. Все, что я получил, было оригинальным файлом имениParam. – truongnm
. Вы решили этот @Andres – truongnm