Backbone + Rails'Paperclip'异步上传

时间:2012-10-27 12:58:29

标签: ruby-on-rails backbone.js coffeescript paperclip ajax-upload

我正在使用骨干和放大器实现异步照片上传rails'Paperclip'gem:

问题:

  1. 我是否需要使用jQuery上传(或等效的lib)?
  2. 如果是这样,我是否只是覆盖photocollection.sync来调用库?
  3. item.rb的

    class Item < ActiveRecord::Base
       has_many: photos
       ...
    

    Photo.rb

    class Photo < ActiveRecord::Base
    
      attr_accessible :photo
      belongs_to :item
    
      has_attached_file :photo
    ...
    

    ItemView.js.coffee

    class MySite.Views.Items.Edit extends Backbone.View
    
      template: JST['items/edit']
    
      initialize: ->
        @modelBinder = new Backbone.ModelBinder
        @model.on('change', @render(), this)
    
      events: ->
        'submit #edit_item_form' : 'save_item'
    
      render: ->
        $(@el).html @template( item: @model )
    
        @new_photo = @model.new_photo()
    
        @modelBinder.bind @model, $("#item_fields")
        @modelBinder.bind @new_photo, $("#photo_fields")
        @
    
      save_item: (e) ->
        e.preventDefault()
        @model.save()
        @new_photo.save()
    

    Edit.jst.eco

    <form id="edit_item_form" accept-charset="UTF-8" data-remote="true" enctype="multipart/form-data">
    <div id="item_fields"> .... </div>
    <div id="photo_fields">
       <input type="file" id="upload_photo" name="photo[photo]" />
    </div>
    ...
    

    欢迎提出改进整体设计的建议

1 个答案:

答案 0 :(得分:2)

我最终选择了简单性和安全性。跨浏览器支持iframe上传。实施实际上非常简单:

MyView.js.coffee:

  events: ->
    'change #upload_photos' : 'upload_photo'

  upload_photo: (e) ->
    upload_frame = $('#add_photo_form')
    upload_frame.prop 'target', 'upload_frame'
    upload_frame.submit()

MyTemplate.jst.eco:

<form id="add_photo_form" method="POST" action="/api/v1/photos" enctype="multipart/form-data">
  <div id="photo_fields">
      <input type="file" id="upload_photos" name="photo[photo]" multiple>
      <input type="hidden" name="authenticity_token" value="<%= $("meta[name='csrf-token']").attr("content") %>">
  </div>
</form>
<iframe id='upload_frame' name='upload_frame' src=''></iframe>

请注意添加CSRF令牌。没有它,请求将失败&amp;让你的会议结束。