【问题标题】:dealing with #create as json with Rails 4, dropzone.js, carrierwave使用 Rails 4、dropzone.js、carrierwave 处理 #create as json
【发布时间】:2016-08-14 14:40:20
【问题描述】:

使用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" = $1 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 - 缺少模板项/继续,应用程序/继续使用 {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[: erb, :builder, :raw, :ruby, :coffee, :arb, :haml, :jbuilder]}。

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

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

【问题讨论】:

    标签: ruby-on-rails json dropzone.js


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢。这比尝试使用 create.json.erb 或 index.json.builder 做一些事情要好?
    • 您可以选择其中之一。我更喜欢这种实现,因为通过这种方式我可以在此类 ruby​​ 中进行操作,因为我可以包含模块或其他帮助程序
    • 我不在电脑旁,所以无法检查,但这有助于运行我必须从照片模型中删除的验证吗?
    • Tim after 显示验证的错误信息。
    • 请看我的回答。我最终不需要这个解决方案,但它确实帮助我更好地理解 json 并且可能对未来有用,所以我赞成答案。
    【解决方案2】:

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

    【讨论】:

    • 请查看我的新#edit 并获得更好的答案显示模型 photo.rb 和 user.rb 并在您的rails console 中尝试模拟验证错误。 photo = Photo.new(user_id:2, picture: nil) ; photo.save ; photo.errors
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2016-12-27
    • 2018-02-23
    • 2013-11-21
    • 1970-01-01
    • 2014-10-16
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多