SORU
17 AĞUSTOS 2010, Salı


Ruby on Rails 3: istemci için Raylar üzerinden veri Akışı

RackSpace cloudfiles (Amazon S3 benzer ancak bazı özellikler eksik) ile iletişim kuran bir Ruby on Rails uygulaması üzerinde çalışıyorum.

Her nesne erişim izinleri ve sorgu dizesi kimlik doğrulama durumu olmaması nedeniyle, kullanıcılar için indirme uygulaması aracılık etmek.

2,3, dinamik olarak aşağıdaki gibi bir yanıt inşa edebilirsiniz gibi görünüyor Raylar

# Streams about 180 MB of generated data to the browser.
render :text => proc { |response, output|
  10_000_000.times do |i|
    output.write("This is line #{i}\n")
  end
}

(http://api.rubyonrails.org/classes/ActionController/Base.html#M000464)

10_000_000.times... yerine benim cloudfiles orada akış nesil kod atarım.

Sorun, bu Raylar bu tekniği 3 kullanmaya çalıştığımda aldığım çıktı.

#<Proc:0x000000010989a6e8@/Users/jderiksen/lt/lt-uber/site/app/controllers/prospect_uploads_controller.rb:75>

Mesela proc call yöntem deniyor nesne görünüyor? Başka fikri olan?

CEVAP
1 Aralık 2010, ÇARŞAMBA


Sadece ata response_body 10 ** yanıt veren bir nesne:

class Streamer
  def each
    10_000_000.times do |i|
      yield "This is line #{i}\n"
    end
  end
end

self.response_body = Streamer.new

1.9 kullanıyorsanız.x veya Backports gem, bu daha da yazabilirsiniz kompakt Enumerator.new kullanarak:

self.response_body = Enumerator.new do |y|
  10_000_000.times do |i|
    y << "This is line #{i}\n"
  end
end

Ve eğer zaman veri aktarılmadan unutmayın Raf işleyicisi ve temel sunucu hücrelerdir. Melez, örneğin, veri akışı olacak doğruladı, ancak diğer kullanıcıların WEBrick, örneğin, yanıt kapanana kadar bu tamponlar bildirdi. Yanıt floş zorlamak için bir yolu yoktur.

3.0 Raylar.x, birkaç ek ayrıntılar var:

  • Geliştirme modunda, numaralandırma içinden model sınıfları erişmek gibi şeyler yapan sınıf yüklenmesi ile kötü etkileşim nedeniyle sorunlu olabilir. Bu open bug Raylar bir 3.0.x.
  • Raf ve Raylar arasındaki etkileşimin bir hata #each iki kez, her istek için aradı neden olur. Bu open bug başka bir şeydir. Aşağıdaki maymun yama ile çözüm bulabilirsiniz:

    class Rack::Response
      def close
        @body.close if @body.respond_to?(:close)
      end
    end
    

Her iki sorunun da Raylar HTTP akışı kayan bir özelliği olduğu 3. 1'de giderilmiştir.

Diğer ortak önerisi, self.response_body = proc {|response, output| ...}, 3.0 Raylar çalışmıyor unutmayın.x, ama (ve artık gerçekten veri akışı) kalmıştır 3.1. Tüm #each works yanıt veren bir nesne atama 3 sürümleri Raylar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • FullMag

    FullMag

    15 ŞUBAT 2007