1

私はRubyOpenGraph Protocol Gemを使用して、YouTube、Vimeo、Metacafe、Dailymotionのビデオに関連する画像とそのタイトルと説明を取得しています。これらの画像は再生ボタンで表示され、ユーザーが画像をクリックすると、ajaxを使用して画像に関連するビデオを読み込んで再生します。

とにかく、更新後、ページの読み込みに15秒以上かかることに気づきました。ビデオ(画像)が添付されているすべてのマイクロポストを削除すると、ページの読み込み時間が通常に戻ります。

ユーザーがマイクロポストを作成すると、マイクロポストに含めたいビデオにリンクでき、そのリンク/ URLのURLは、私のDBに設定されているマイクロポストテーブルのリンク列に保存されます。

私の見解では、現在ループされているマイクロポストのリンクをヘルパーメソッドに渡して、ビデオ用のオープングラフプロトコルオブジェクトを取得します。次に、返されたオブジェクトからimageプロパティを取得し、image_tagヘルパーを使用して関連する画像を表示します。

image_tag get_video_data(micropost.link).image

これは私がオープングラフプロトコルgemと通信する方法です..ヘルパー:

def get_video_data(url)
  OpenGraph.fetch(url)
end

とにかく、これはすべて私のページの読み込み時間を劇的に遅くします。これを修正する方法があるかどうか疑問に思いましたか?この問題は、異なるURLからそれらの個々の画像をロードする必要があることが原因だと思います。これは、関連するマイクロポストを削除してページをリロードすると、ロード時間が通常に戻るためです。私のアプリにある画像は問題を引き起こしません。

ユーザーがマイクロポストを投稿するときは、基本的に、投稿に追加したいビデオのリンクを貼り付けてから、ビデオの画像が表示され、[投稿]をクリックしてマイクロポストが投稿されます。

次のような動画の画像を表示できるように、その画像をアプリにアップロードする方法を教えてください。

image_tag micropost.video_image

このようにすると、外部URLから画像を取得する必要がないため、ページの読み込みが速くなります。

これがfb、google +などのより大きなウェブサイトでどのように行われるのかはよくわかりませんが、解決策を教えてくれる方法を知りたいと思います。

敬具。

4

2 に答える 2

2

これは、OpenGraph.fetch(url)がhttpリクエストを起動して、画像タグを見つけるために必要なデータを取得するためです。これはアクションのレンダリング中に発生する必要があるため、すべてが完了するまでクライアントに情報を送信することはできません。

これに対処する方法はたくさんありますが、opengraph識別子を指定するとopengraphデータを返し(基本的にはヘルパーメソッドをコントローラーに入れます)、識別子をメインアクションのビューhtmlにのみ出力する新しいアクションを作成することをお勧めします。次に、JavaScriptでそれらすべてを見つけ、AJAXリクエストを実行して、OpenGraphデータを取得し、応答が得られたらページのHTMLを更新します。これにより、ブラウザはページのレンダリングをブロックせずにhttpリクエストを並行して実行できるようになります。ボーナスポイントについては、OpenGraphの応答をmemcacheまたは妥当な有効期限のあるものにキャッシュし、毎回アプリからHTTPリクエストを行う必要がある待ち時間を節約できます。

于 2012-05-31T16:46:37.327 に答える
0

仮定

  • video_imageのdb列を含むペーパークリップ
  • バックグラウンド処理のためのdelayed_job

基本的なコードは次のようになります。

class Micropost
   # 
   has_attached_file :video_image, :default_url => "/path/to/progress_image"

   after_save :fetch_external_video 

 protected

   def fetch_video_image 
     img = OpenGraph.fetch(url)
     reload.video_image = img
     save!
   end
   # put in background 
   handle_asyncronously :fetch_video_image

end

その後、あなたはあなたのビューで使用することができます

image_tag micropost.video_image.url

これにより、ビデオがまだフェッチされている間、デフォルトのimgが表示されます。この単純なソリューションは、URLが変更されていない場合でも、保存するたびに画像を新たにフェッチします。

ユーザーが同じリンクを再利用する可能性が高い場合は、

  • 新しいクラスへのビデオ画像の抽出
  • micropostを持っている:has_one video_image、おそらくvideo_linkableのように多形
  • fetch_video_imageをafter_createコールバックとして配置します
  • micropost.video_image.find_or_create_by_url(url)を使用します

これにより、重複やフェッチを1回行うことなく、さまざまなオブジェクトへの複数のビデオリンクを作成できます。

于 2012-05-31T17:27:12.180 に答える