2

現在、コメントが表示されるテンプレートに各ループがあります。ユーザーが投稿したマイクロポストに50件のコメントがあるとします。50件のコメントを示す長いリストが表示されます。

ページのスペースを節約するために、表示されるコメントをマイクロポストごとに2〜3に制限することにしました。ユーザーがもっと見たい場合は、「もっと見る」または「すべて見る」をクリックできます。10,000件のコメントがあり、ユーザーが[すべて表示]をクリックした場合、サーバーはどのように対処するのでしょうか。そのため、[もっと表示]を実装してから、さらに50件のコメントを表示することを選択できます。

とにかく、ユーザーがすべてを表示することを選択するまで、ユーザーに表示されるコメントの量を制限するための良い方法を知りたいですか?

jquery / jsルートに移動して、最新の2〜3個のメッセージのみが表示されるようにすると、他のメッセージはバックエンドでロードされたままになるので、RubyonRailsでこれを制御するのが適切なオプションではありません。何とかして?

これを行うための最良の方法に関するいくつかの素晴らしい解決策/情報が本当に欲しいです。

あなたが必要とするさらなる情報は私が提供させていただきます。

よろしくお願いします

4

3 に答える 3

2

Facebookのようにできます:

  • 2/3のコメントのみを表示します。バックエンドから2/3のコメントのみをロードします。
  • ユーザーが[もっと見る]をクリックすると、さらに50個表示されます。AJAXを介してそれらをロードします。したがって、バックエンドでは、「最初の3つを除いて50件のコメントを取得する」などのリクエストのみを受け取ります。
  • 別の「もっと見る」リンクが表示されます。53個の最初のコメントを除いて50個の他のコメントをロードします。

Facebookでは、一度に50を超えるコメントを読み込むことはできません。私はあなたが同じことをすべきだと思います。

于 2012-04-16T12:36:07.960 に答える
0

クリーンな方法は、コメントのページ付けを実装することです。

于 2012-04-16T12:55:03.533 に答える
0

との間には単純なbelongs_to関係があるhas_manyPost思いますComment。私は通常行います:

ルート:

resources :posts do
  resources :comments
end

モデル:デフォルトのページサイズを設定します:

class Comments < ActiveRecord::Base
  belongs_to :post

  DEFAULT_PAGE_SIZE = 25
end

コントローラ:

class CommentsController
  def index
    post = Post.find(params[:post_id])
    offset = params[:offset] || 0
    limit = params[:limit] || Comment::DEFAULT_PAGE_SIZE
    @comments = post.comments.offset(offset).limit(limit)

    respond_to do |format|
      #respond as you like
    end
  end

  # more actions...
end

ビュー、ajaxを介してコメントをロードするために、次のようなリンクをさらにロードします。

<%= link_to "load more comments", post_comments_path(@post, :format => 'js'), :method => :get, :remote=>true id='load-more-comments' %>

また、オフセットをajaxポストにバインドしたいとします。

$ ->
  $('#load-more-comments').on 'ajax:before', (event) ->
    el = $(this)
    offset = #count your offset, I often do by counting the <li>s already in the <ul>
    el.data 'params', "offset=#{offset}"
    # you could also pass the limit: el.data 'params', "offset=#{offset}&limit=#{some limit}"
  .on 'ajax:complete', (event, xhr, status) ->
    el = $(this)
    el.removeData 'params' # remember to remove this.

私はまた、これを行うためのより良い方法に興味があります。答えと批評家を楽しみにしています。:)

于 2012-04-16T13:02:42.393 に答える