2017-07-21 3 views
1

Je découvre la gemme will_paginate ce qui est génial! Mais je suis confronté à un problème d'utilisation. Je suis en train de créer un groupe> post> commentaires, alors dans ma page de groupe, j'affiche des posts et leurs commentaires. Pour limiter le nombre de requêtes, je suis en utilisant la méthode comprend comme ceci:Will_paginate pour inclut des commentaires

Group_controller:

def show 
    @posts = @group.posts.order(upd_at: :desc).includes(:user).includes(comments: :user).paginate(page: params[:page], per_page: 10) 
    end 

Je voudrais aussi paginera mes commentaires. Connaissez-vous un moyen de le faire?

Mon code: Group_show =

<h1>Groupe <%= @group.name %></h1> 
<div class="post_list<%[email protected]%>"> 
    <%= render @posts %> 
</div> 
<%= will_paginate @posts, renderer: BootstrapPagination::Rails %> 

Et mes messages/_POST =

<% @comments = post.comments %> 
<ul id="comment_list<%=post.id%>"> 
    <%- if @comments.any? %> 
    <%= render @comments, post: post %> 
    <%= will_paginate @comments, renderer: BootstrapPagination::Rails %> 
    <% end %> 
</ul> 

En passant, si vous avez une méthode pour définir @comments directement dans le Groups_controller (spectacle), il peut être vraiment utile;)

+0

Je me demande s'il est plus logique de limiter simplement votre 'post.comments' le plus récent (3):' post.comments.order (created_at:: desc) .limit (3) '. Puis avoir un bouton qui effectue une requête ajax à un autre point de terminaison qui rendra les demandes restantes si elles sont souhaitées par l'utilisateur ... Je pense que ce serait plus efficace. – BigRon

+0

@BigRon, merci pour votre réponse, je commande déjà ceci comme ça dans mon commentaire de modèle. Pouvez-vous montrer comment peut ressembler à une requête ajax pour effectuer cela? –

+0

Essayez '@posts = Post.where (group_id: @ group.id) .order (upd_at: desc) .include (: utilisateur, {commentaires:: user})' – Thanh

Répondre

1

Pas 100% testé, mais je pense que cela devrait fonctionner. Savez-vous comment fonctionnent tous ces composants? Si non, laissez-moi savoir et je peux expliquer.

messages/_POST

<% @comments = post.comments.order(created_at: :desc).limit(3) %> 
<ul id="comment_list<%=post.id%>"> 
    <%- if @comments.any? %> 
    <%= render @comments, post: post %> 
    <%- if post.comments.offset(3).exists? # this is more efficient than count > 3 bc it quits counting after 3 %> 
     <!-- the below link_to creates: href="/posts/:id/comments" ... --> 
     <!-- ... and `remote: true` makes that an ajax request --> 
     <li><%= link_to "more", comments_post_path(post), class: "more-comments-btn", remote: true %></li> 
    <% end %> 
    <% end %> 

</ul> 

config/routes.rb

resources :posts do 
    # `member do` is explained here: http://guides.rubyonrails.org/routing.html#adding-more-restful-actions 
    member do 
    get :comments 
    end 
end 

posts_controller.rb

# GET /posts/:id/comments 
def comments 
    @post = Post.find(params[:id]) 
    @comments = @post.comments.order(created_at: :desc) 
    # since you requested this url via ajax with `remote: true` rails will automatically render `posts/comments.js.erb` ... 
    # ... rather than a typical html request where rails would automatically render `posts/comments.html.erb` 
end 

vues/messages/comments.js.erb

// some people like to use render @comments as shorthand like you did above. I'm a fan of being more explicit like the below 
$("#comment_list<%= @post.id %>").html("<%= escape_javascript(render partial: 'comments/comments', locals: {comments: @comments, post: @post}) %>"); 
// now remove the more comments button 
$("#comment_list<%= @post.id %>").find(".more-comments-btn").remove(); 

La documentation here explique l'utilisation de remote: true pour les demandes ajax. Faites défiler jusqu'à la section "3.1.2 link_to", puis la section 5.1 pour la vue controller et js.erb.

+0

merci beaucoup @BigRon pour votre explication sur ce sujet. La façon d'y parvenir semble beaucoup plus claire maintenant. J'ai encore quelques erreurs mais je peux travailler pour résoudre cela par moi-même. Merci encore, bonne continuation sur vos affaires –