如果您要自定义dropzone,我不明白URL
和paramName
应该是什么?
Dropzone.autoDiscover = false
$('#new_picture').dropzone
url: '/projects'
maxFilesize: 1
paramName: 'project_images[photos]'
addRemoveLinks: true
我非常确定我的paramName和url是错误的。
我有这样的嵌套回形针:
<%= simple_form_for @project, html: { multipart: true } do |f| %>
<div class='dropzone' id="new_picture">
<div class="fallback">
<%= file_field_tag "photos[]", multiple: true %>
</div>
</div>
<% end %>
class ProjectImage < ActiveRecord::Base
belongs_to :project
has_attached_file :photo,
:styles => {
:large => "800x800>",
:thumb => "150x150#" },
:default_url => "/images/:style/missing.png"
validates_attachment_content_type :photo, content_type: /\Aimage\/.*\Z/
attachment :file
end
def project_params
params.require(:project).permit(
:user_id,
project_images_attributes: [:id, :project_id, :photo, :_destroy])
end
def create
@project = Project.new(project_params)
respond_to do |format|
if @project.save
if params[:photos]
params[:photos].each { |image|
@project.project_images.create(photo: image)
}
end
end
end
end
答案 0 :(得分:0)
实际上,当url
未定义任何操作时,会指定form
。我曾经使用dropzone.js
这样:
= form_tag new_drag_drop_photo_path, method: :post, class: "dropzone form-horizontal", id: "media-dropzone", :authenticity_token => true do
= file_field_tag "photo", multiple: true
现在,当我的dropzone字段中拖放照片时,它将被发送到此定义的操作:
Started POST "/new_drag_drop_photo" for 127.0.0.1 at 2015-07-24 10:55:04 +0530
Processing by PhotosController#new_drag_drop_photo as JSON
Parameters: {"utf8"=>"✓", "authenticity_token"=>"rmp7BwrEoa7iCesuPifQm60YwAemDCfq6t7soQ==", "file"=>#<ActionDispatch::Http::UploadedFile:0x007f6b78ab5190 @tempfile=#<Tempfile:/tmp/RackMultipart20150724-4280-1obqg7k.jpg>, @original_filename="bridal-dresses-4.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"bridal-dresses-4.jpg\"\r\nContent-Type: image/jpeg\r\n">}
现在,由于您没有使用form
,而是使用div
,因此您需要定义url
,以便在拖动时发送照片。这将是json
请求,dropzone
将期望来自服务器的json
响应。所以你需要一个控制器的动作,就像我指定的那样:
def new_drag_drop_photo
@photo = Photo.new(image: params[:file], name: params[:file].original_filename.split('.')[0])
if @photo.save!
respond_to do |format|
format.json{ render :json => @photo }
end
else
render json: { error: @photo.errors.full_messages.join(',')}, :status => 400
end
end
现在我在这里从文件本身获取filename
。当您在dropzone配置中提供如下:paramName: 'project_images[photos]'
时,它会在文件发送到控制器的操作时传递此名称。由于你在这里使用了嵌套表单,我也使用了它,但是我使用了一些jquery来添加photo_ids。所以我做的是先将照片上传并保存在数据库中,然后以嵌套的形式分配id。
希望这有帮助。