处理#create as json with Rails 4, dropzone.js, carrierwave
dealing with #create as json with Rails 4, dropzone.js, carrierwave
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
被允许是 ''
但它仍然必须是以表格形式传递,否则无法创建照片。然后我可以在控制器中简单地使用 json
到 render
。
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
被允许是 ''
但它仍然必须是以表格形式传递,否则无法创建照片。然后我可以在控制器中简单地使用 json
到 render
。