处理#create as json with Rails 4, dropzone.js, carrierwave

dealing with #create as json with Rails 4, dropzone.js, carrierwave

使用dropzone.js

Started POST "/photos"
Processing by PhotosController#create as JSON
Parameters: {"utf8"=>"✓", "authenticity_token"=>"4ZYgROGmbmA7znV9JAG7rfzVhDLfcaDoAVHVJtvj0Il5EEgBDaPCBk99HLaVKxfl69o+cs/aZgpch2Hj5kR7dw==", "photo"=>{"user_id"=>"2"}, "file"=>#<ActionDispatch::Http::UploadedFile:0x007fd784bb2ef8 @tempfile=#<Tempfile:/tmp/RackMultipart20160814-13-1roacdt.JPG>, @original_filename="DSCN2462.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"DSCN2462.JPG\"\r\nContent-Type: image/jpeg\r\n">}
[1mSELECT  "users".* FROM "users" WHERE "users"."id" =  LIMIT 1[0m  [["id", 2]]
[1mROLLBACK[0m
Rendered photos/create.json.erb (0.0ms)

def create
  @photo = current_user.photos.build(photo_params)
end

<%= form_for :photo, url: photos_path, html: {class: 'dropzone', id: 'dropform' } do |f| %>
  <%= f.hidden_field :user_id, value: current_user.id %>
<% end %>

<script type="text/javascript">
  $(document).ready(function(){
    Dropzone.autoDiscover = false;
    $("#dropform").dropzone({
        maxFilesize: 5,
        paramName: "photo[picture]",
        addRemoveLinks: false, 
    }); 
});
</script>

当照片被添加到拖放区时,上面有一个复选标记,但它没有被输入到数据库中。没有提交。之前有错误:

ActionView::MissingTemplate - Missing template items/continue, application/continue with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :arb, :haml, :jbuilder]}.

所以我制作了一个create.json.erb文件,但我不知道该往里面放什么。

此外,为了达到这一点,我不得不从 photo.rb 中删除一些验证,因为我收到了 include? 之类的错误消息...我猜是因为数据是在 json 它无法读取验证。

def create
    @photo = current_user.photos.build(photo_params)
    if @current_userphoto.save
      respond_to do |format|
        format.json{ render :json => PhotoPresenter.new(@photo).to_json, status: ok } 
      end
    end
end

#create a app/presenter/photo_presenter.rb

class PhotoPresenter
  include CarrierWave::MimeTypes

  def initialize(object)
    @photo = object
  end 

  def json
      {"asset": {
          "id": @photo.id,
          "name" => @photo.picture_identifier,
          "type": @photo.picture.content_type,
          "size": @photo.picture.size,
          "url" => @photo.picture.url,
          "imageURL": @photo.picture.try(:url),
          "accepted": true,

        }
      }
    end
end

编辑

对于您验证的问题,您有不止一次的解决方案

# photo.rb

class Photo < ActiveRecord::Base

  attr_accessor :validate_off
  validates_presence_of :title, unless: Proc.new {|obj| obj.validate_off == true}

end

# photos_controller.rb

def create
    @photo = current_user.photos.build(photo_params)
    @photo.validate_off = true
    if @photo.save
      respond_to do |format|
        format.json{ render :json => PhotoPresenter.new(@photo).to_json, status: ok } 
      end
    end
end

最后我实际上不需要 js.erb 或 json.erb 文件,也不需要 Breno 的解决方案。问题是我有一些验证需要提交一些参数,例如,有一个 :title 验证,虽然 :title 被允许是 '' 但它仍然必须是以表格形式传递,否则无法创建照片。然后我可以在控制器中简单地使用 jsonrender