Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails-4 Carrier没有通过ajax保存上传的文件_Ruby On Rails 4_File Upload_Ember.js_Carrierwave - Fatal编程技术网

Ruby on rails 4 Rails-4 Carrier没有通过ajax保存上传的文件

Ruby on rails 4 Rails-4 Carrier没有通过ajax保存上传的文件,ruby-on-rails-4,file-upload,ember.js,carrierwave,Ruby On Rails 4,File Upload,Ember.js,Carrierwave,我正在尝试使用ajax上传来上传一个使用Rails carrierwave gem的文件 在Rails模型中,如果我注释掉carrierwave uploader,图像将被加载 class Asset < ActiveRecord::Base #mount_uploader :attachment, AttachmentUploader end 但是,当我使用carrierwave uploader时,文件

我正在尝试使用ajax上传来上传一个使用Rails carrierwave gem的文件

在Rails模型中,如果我注释掉carrierwave uploader,图像将被加载

   class Asset < ActiveRecord::Base
     #mount_uploader :attachment, AttachmentUploader                              
   end
但是,当我使用carrierwave uploader时,文件被正确地传递到发送到controllerr的参数中,但是,它保存为nil

     started POST "/api/assets.json" for 127.0.0.1 at 2014-11-12 13:27:59 +0000
       Processing by Api::AssetsController#create as JSON
       Parameters: {"asset"=>{"attachment"=>"C:\\fakepath\\wiz.jpg"}}
       (0.1ms)  begin transaction
       SQL (0.3ms)  INSERT INTO "assets" ("attachment", "created_at", "updated_at")
       VALUES (?, ?, ?)  [["attachment", nil],
       ["created_at", "2014-11-12 13:27:59.814416"],    
       ["updated_at", "2014-11-12 13:27:59.814416"]]
       (7.0ms)  commit transaction
请求头包含多部分

Remote Address:127.0.0.1:4200
Request URL:http://localhost:4200/api/assets.json
Request Method:POST
Status Code:200 OK

Accept:*/*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryX8gWNEUkD4hyVsxz
请求有效负载如下所示:

   ------WebKitFormBoundaryX8gWNEUkD4hyVsxz
   Content-Disposition: form-data; name="asset[attachment]"

   C:\fakepath\wiz.jpg
   ------WebKitFormBoundaryX8gWNEUkD4hyVsxz--
Rails控制器

    class Api::AssetsController < ApplicationController
       def create
         @asset = Asset.new(asset_params)
         @asset.attachment = params[:asset][:attachment]
         if @asset.save
           render json: @asset, status: :ok
         end
        end

        private

       def asset_params
         params.require(:asset).permit(:attachment)                     
       end
    end
class Api::AssetController
老实说,我发现carrier遇到的麻烦比从第一次上传文件到检索已经上传的文件时出现的不一致的模型状态属性要多。其复杂程度令人难以置信

我建议您只需遵循以下步骤。rails控制器非常简单,您可以完全控制您想要做的事情,延迟到队列进行后台处理。。。你要什么都行。它很好,干净,容易和简单的改变需要。和您一样,我使用Ember和ajax将文件作为多部分表单数据发送,并且它可以正常工作

在我看来,这些宝石中的很多都是麻烦,因为它们混淆了不同的关注点,最终把事情搞得一团糟。我看不到他们提供的附加值

如果您想后期处理图像,只需使用您选择的图像处理库(ruby VIP很快),如果您想处理CSV文件,只需执行您需要的操作。不需要复杂的变体处理和匹配垃圾,因为这些垃圾具有一些令人讨厌的订购边缘案例


如果你真的必须使用CalaveWaveAdvabor GEM,那么很抱歉,我可能没有回答你的问题,但也许我已经让你考虑了你从中得到的真正价值。

< P>我决定不使用HTML5表单数据来发送表单,而是使用jQuery文件上传插件。通过该更改,carrierwave可以检测文件上载。

您可以将上载程序文件和表单与模型一起添加吗
    class Api::AssetsController < ApplicationController
       def create
         @asset = Asset.new(asset_params)
         @asset.attachment = params[:asset][:attachment]
         if @asset.save
           render json: @asset, status: :ok
         end
        end

        private

       def asset_params
         params.require(:asset).permit(:attachment)                     
       end
    end