2011-10-24 8 views
0

私はAJAXベースのアップロードを私のレールプロジェクトに実装しました。ruby​​ on rails:request.body.readにエラーが表示されます

これは私のコード例です。私は私のコードを実行すると、私はライン「STR = request.body.read」

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

エラーの詳細に次のエラーメッセージが表示されました

********** 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 

(私はhttps://github.com/valums/file-uploader ...ここからチュートリアルに続きます)多く: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

また、なぜ世界では1.2.1のレールを使用していますか?そのバージョンは_古いです。 – Frost

+0

OH !!!!私はそれについて、感謝についてお話します。 Bcz、私のプロジェクトは7歳です。だから私は更新できません。 :-) –

答えて

1

Rails 1.2.1となり、ActionController :: CgiRequestもその親ActionController :: AbstractRequestも 'body'メソッドを含んでいません。これらのページを見ると、cgi_process.rbrequest.rbと表示されます。なぜあなたはそのような古いレールのバージョンを使用していますか?

更新 @Mr。ブラック。あなたは「この要求オブジェクトに似た着信要求を読み取るための代替手段を教えてもらえますか?」と書いています。 githubから 'file-uploader'ライブラリを使用しています。ご覧のとおり、このライブラリは2つの方法でファイルをサーバー側にアップロードできます。ユーザーが古いFF、Chromeブラウザ、またはそのライブラリがiframeへの投稿リクエストを行うIEバージョンを持っている場合。ユーザーに最新の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 
..... 

githubプロジェクトからdemo.htmを使用できますが、パブリックフォルダに配置する必要があります。 fileuploader.cssとfileuploader.jsを忘れないでください! :) createUploader関数の 'action'をアクションパスに変更する必要があります。私の場合は '/ upload'となります。

+0

ああ!ええ、お元気ですか@WarHog。このリクエストオブジェクトに似た着信リクエストを読み取る別の方法を教えてください。 –

+0

私は以前の投稿を更新し、いくつかの例を書いています。がんばろう! – WarHog

関連する問題