我正在尝试使用ajax上传来使用Rails carrierwave gem上传文件。
在Rails模型中,如果我注释掉载波上传器,则会加载图像
class Asset < ActiveRecord::Base
#mount_uploader :attachment, AttachmentUploader
end
以下是当载波注释出
时的上传保存 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", "C:\\fakepath\\wiz.jpg"],
["created_at", "2014-11-12 21:19:50.456924"],
["updated_at", "2014-11-12 21:19:50.456924"]]
(7.8ms) commit transaction
但是,当我使用carrierwave上传器时,文件在发送给控制器的参数中正确传递,但是,它保存为 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
答案 0 :(得分:0)
老实说,我发现carrierwave比第一次上传文件时检索到已经上传的文件时出现的模型状态属性不一致更麻烦。卷积和彻头彻尾的复杂性是不可置信的。
我建议只关注rails guide on uploading files。 rails控制器非常简单,您可以完全控制自己想要做的事情,按照队列进行后台处理......无论您想要什么。它的美观,干净,简单,易于更换。和我一样,我使用Ember和ajax将文件作为多部分表单数据发送,并且它可以工作。
IMO很多这些宝石比它们的价值更麻烦,因为它们混淆了不同的问题,最终弄得一团糟。我没有看到他们提供的增值。
如果您想发布过程图像,只需使用您选择的图像处理库(ruby vips很快),如果您想处理CSV文件,只需执行您需要的操作。不需要复杂的变体处理和匹配垃圾,它有一些讨厌的排序边缘情况。
如果你真的必须使用carrierwave uploader gem那么我很抱歉我可能没有回答你的问题,但也许我已经让你考虑到你认为你从中得到了什么真正的价值..
答案 1 :(得分:0)
我决定不使用HTML-5表单数据来发送表单,而是使用jquery-file-upload插件。有了这个改变,carrierwave就可以检测到文件上传。