Dropzonejs和Paperclip,url和paramName?

时间:2015-07-24 02:15:18

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip dropzone.js

如果您要自定义dropzone,我不明白URLparamName应该是什么?

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 %>

我有一个project_image.rb

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

my params在projects_controller.rb

中看起来像这样
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

1 个答案:

答案 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。

希望这有帮助。