2011-10-24 33 views
0

我在我的rails項目中實現了基於AJAX的上傳。ruby​​ on rails:request.body.read顯示錯誤

這是我的示例代碼。 (我也跟着從這裏教程.. https://github.com/valums/file-uploader

********** Javascript Code ********** 

function createUploader(){ 
    var uploader = new qq.FileUploader({ 
     element: document.getElementById('file-uploader'), 
     action: '/product/upload',   
    }); 
} 

window.onload = createUploader; 

********** Server side ********** 
def upload 
    @filename = params['qqfile'] 

    f = File.open('home/files/' + @filename, "wb") 
    str = request.body.read 
    f.write(str) 
    f.close 

    render :text => '{success:true}' 
end 

運行我的代碼,我得到了行了以下錯誤消息「海峽= request.body.read」

NoMethodError (undefined method `body' for #<ActionController::CgiRequest:0xb6cd71a0>): 

錯誤的詳細信息更多:http://www.heypasteit.com/clip/01NE

我的配置:

[[email protected] home]# ruby -v 
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-linux] 
[[email protected] home]# rails -v 
Rails 1.2.1 
[[email protected] home]# gem -v 
1.8.6 

你能請清除我,我錯了什麼?

+0

它看起來像行'str = request.body.read'是這裏的錯誤行, 'request'對象沒有'body'方法。 – Frost

+0

另外,爲什麼你在世界上使用rails 1.2.1?該版本是_really_舊的。 – Frost

+0

OH !!! ..我會回顧一下,謝謝。 Bcz,我的項目已經7歲了。這就是爲什麼我無法更新。 :-) –

回答

1

在Rails 1.2.1中成爲既沒有ActionController :: CgiRequest也沒有它的父ActionController :: AbstractRequest包含'body'方法。你可以看看這些頁面:cgi_process.rbrequest.rb。你爲什麼要使用這種舊的鋼軌版本?

UPDATE @Mr。黑色。你寫了「請告訴我任何替代方法來讀取類似於這個請求對象的傳入請求」。 您正在使用github上的'file-uploader'庫。正如我所看到的,該庫可以通過兩種方式將文件上傳到服務器端。如果用戶使用舊的FF,Chrome瀏覽器或任何IE版本庫向iframe發出發佈請求。如果用戶使用現代FF或Chrome版本庫,則準備異步發佈xmlHttpRequest。因此,在我們的鐵軌控制器中,我們必須處理這兩種情況。例如,爲了簡單起見,我們希望將發送的文件數據寫入磁盤上的某個硬編碼位置。

******** app/controllers/greetings_controller.rb ******** 
class GreetingsController < ApplicationController 
    def upload 
    begin 
     is_xhr = params[:qqfile].is_a? String 
     data = is_xhr ? request.body : params[:qqfile] 
     File.open("/some_place_on_disk/bar.txt", "w") { |f| f.write(data.read) } 
     @result = {success: true} 
     if is_xhr 
     render :json => @result 
     end 
     # else render view 
    rescue Exception => e 
     logger.info e 
     @result = {error: "Error has been encountered during the processing"} 
    end 
    end 
end 

******** app/views/upload.html.erb ******** 
<%= @result.to_json %> 


******** config/routes.rb ******** 
..... 
match '/upload' => 'greetings#upload', :via => :post 
..... 

您可以使用demo.htm從GitHub項目,但你必須把它放到公用文件夾。不要忘記fileuploader.css和fileuploader.js! :)你必須改變'行動'在createUploader函數行動路徑,在我的情況下,將'/上傳'

+0

啊!!是的..謝謝@WarHog。你能告訴我任何替代方式來讀取類似於這個請求對象的傳入請求嗎? –

+0

我已更新以前的帖子,並寫了一些例子。祝你好運! – WarHog