ruby on rails: request.body.read показывает ошибку - PullRequest
0 голосов
/ 24 октября 2011

Я реализовал загрузку на основе AJAX в моем проекте rails.

Это мой пример кода. (Я следовал уроку отсюда .. 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

Когда я запускаю свой код, я получаю следующее сообщение об ошибке в строке "str = request.body.read"

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

подробности ошибки Подробнее: http://www.heypasteit.com/clip/01NE

Моя конфигурация:

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

Можете ли вы очистить меня, что я не так?

1 Ответ

1 голос
/ 24 октября 2011

В Rails 1.2.1 ни ActionController :: CgiRequest, ни его родительский ActionController :: AbstractRequest не содержат метод body.Вы можете увидеть это, если посмотрите на эти страницы: cgi_process.rb и request.rb .Почему вы используете такие старые рельсы версии ??

ОБНОВЛЕНИЕ @Mr.Черный.Вы написали: «Можете ли вы сказать мне любой альтернативный способ прочитать входящий запрос, похожий на этот объект запроса».Вы используете библиотеку 'file-uploader' из github.Как я вижу, эта библиотека может загружать файлы на сервер двумя способами.Если у пользователя старые 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 на путь действия, в моем случае это будет '/ upload'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...