2012-02-25 71 views
12

出於某種原因,使用帶有Ajax的CarrierWave gem似乎不適合我。難道我做錯了什麼?我很好地跟蹤了253 CarrierWave Railscast,它的工作原理沒有AJAX,但在我的應用程序中,我需要使用AJAX。這裏是我的代碼:Ruby on Rails CarrierWave gem是否可以使用Ajax?

在圖像文件中的字段選擇JPEG後PARAMS列表:

Parameters: {"item"=>{"remote_image_url"=>""}} 

new.html.erb:

<%= form_for(@item, :url => create_item_path, :html => {:id => "create_item_form", :multipart => true}) do |f| %> 
    <p> 
     <%= f.file_field :image %> 
    </p> 
    <p> 
     <%= f.label :remote_image_url, "or image URL" %><br /> 
     <%= f.text_field :remote_image_url %> 
    </p> 
    <%= f.submit "Save", :id => "save_button" %> 
<% end %> 

的application.js

$("#create_item_form").submit(function() { 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr("action"), 
     dataType: "script", 
     data: $("#destination_item").sortable('serialize') + "&" + $(this).serialize() 
     }); 
     return false; 
}); 

item.rb

class Item < ActiveRecord::Base 
    attr_accessible :description, :image, :remote_image_url 
    belongs_to :user 
    has_many :item_sub 
    mount_uploader :image, ImageUploader 
end 

schema.rb

create_table "item", :force => true do |t| 
    t.integer "user_id" 
    t.string "title" 
    t.string "image" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

我在我的Gemfile的carrierwave寶石,我還沒有在app /上傳/ image_uploader.rb改變任何東西。

感謝您的幫助!

回答

14

沒有使用像Uploadify一樣的庫沒有什麼可以做。這是因爲XMLHttpRequest(AJAX)標準不支持文件上傳。你真的可以僞造這個的唯一方法就是使用帶有Flash的iFrame。 Uploadify是這些選項中的最佳選擇,它具有最好的文檔。這就是客戶端(瀏覽器)所要做的。 Uploadify確實不是一個紅寶石,它是一個允許瀏覽器'僞裝'的閃存和js集合。

在服務器端,您可以使用carrierwave支持上傳,但是您需要一種方法從客戶端獲取它們。這是一個非常類似的問題,應該給你你需要的指示。

Rails Carrier Wave with JQuery Uploader

希望這有助於

+2

那麼你會給我我的賞金嗎? – TheDelChop 2012-02-28 02:07:40

+1

正如在下面的其他答案中指出的那樣,除非您需要支持舊版瀏覽器[XHR2](http://caniuse.com/#feat=xhr2)已經支持'FormData'一段時間了。值得嘗試的是,如果它可用於您並且只能回退到其他庫以獲得傳統支持。 – mczepiel 2014-11-15 19:02:09

+3

此時此答案已過時。 HTML5具有FormData和File API,允許通過AJAX上傳文件。請參閱[這裏](http://stackoverflow.com/questions/166221/how-can-i-upload-files-asynchronously/8758614#8758614)瞭解更多信息。 – 2015-09-07 19:01:32

-1

你不能通過像這樣的ajax上傳文件。你需要這樣的東西: http://www.uploadify.com/

+0

爲什麼不能這樣做?是否因爲CarrierWave不支持Ajax提交?我正在嘗試使用最少量的寶石。謝謝 – EverTheLearner 2012-02-27 20:28:13

+0

因爲XMLHttpRequest不支持文件上傳。 – tybro0103 2012-02-28 03:52:01

+0

小心解釋downvote?我的回答和接受的一樣,甚至在回答之前都有答案。我們現在知道你確實可以在現代瀏覽器中使用ajax來做文件上傳,但是如果你想支持較老的(IE8),你仍然需要一個解決方法。 – tybro0103 2014-11-17 19:40:46

8

您現在可以通過使用FORMDATA上傳通過Ajax文件,而無需使用外部庫()

SEE:LINK 1 & LINK 2