2009-11-23 5 views
2

Je suis nouveau sur les rails alors allez-y doucement. J'ai créé un blog. J'ai mis en place avec succès des commentaires et les ai joints à chaque message. Maintenant ... Je voudrais afficher, dans la barre latérale, une liste des commentaires les plus récents de tous les messages. Je pense qu'il y a deux choses impliquées ici, une mise à jour de comment_controller.rb, et ensuite l'appel de la page actuelle. Voici le code du contrôleur de commentaires.Comment afficher tous les commentaires dans une vue Rails?

class CommentsController < ApplicationController 

    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create!(params[:comment]) 

    respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

Répondre

5

Si vous souhaitez afficher tous les commentaires de tout poste, pour la plus récente, vous pouvez faire:

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10) 

Et dans la vue que vous pouvez faire:

<% @comments.each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 
+0

Cela ressemble à ce que je cherche. Je l'ai juste essayé et ça n'a pas marché. Je suppose que c'est parce que je le mentionne incorrectement. La deuxième partie (la vue) est en train d'être mise dans le dossier de mise en page pour les messages ... cela change-t-il les @comments en commentaires, et vice versa? – bgadoci

+0

Si vous le mettez dans la mise en page, vous pouvez simplement insérer l'instruction find dans la disposition comme suit: <% Comment.find (: all,: order => 'created_at DESC',: limit => 10) .each faire | commentaire | -%> Je ne sais pas comment cela se formera dans un commentaire, mais j'espère que cela a du sens. En général mettre la logique dans les vues est mal vu, mais la seule autre façon que je peux penser que vous auriez accès à la variable @comments sur chaque page est si vous mettez un crochet à exécuter avant chaque méthode dans ApplicationController. – mmrobins

+0

Qui a travaillé l'homme. Merci. – bgadoci

4

Je publie une réponse distincte puisque le code ne semble pas bien formater du tout dans les commentaires.

Je devine que le problème que vous rencontrez avec la réponse précédente est que vous mettez

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10) 

dans l'une de vos méthodes de contrôleur. Cependant, vous voulez que @comments soit disponible pour un fichier de mise en page, vous devrez donc le mettre sur chaque méthode de contrôleur pour chaque contrôleur afin que cela fonctionne. Bien que la logique mise en vues est mal, je pense qu'il serait acceptable de faire ce qui suit dans votre fichier de mise en page:

<% Comment.find(:all, :order => 'created_at DESC', :limit => 10).each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 

Pour obtenir une partie de la logique de la vue que nous pouvons déplacer dans le modèle Commentaire

class Comment < ActiveRecord::Base 
    named_scope :recent, :order => ["created_at DESC"], :limit => 10 

maintenant, vous pouvez le faire à votre avis:

<% Comment.recent.each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 

cela fait une belle fat model and skinny controller

+1

J'aime la portée nommée, et même si le code de la vue est très propre, cela contourne complètement le contrôleur. Je suppose que ma première photo serait d'appeler 'Comment.recent' dans un before_filter dans App Controller, mais je pourrais me tromper là-dessus. –

+0

+1 pour la portée nommée, mais Andy a raison. Cela appartient au contrôleur d'application en tant que filtre avant. Cela fonctionne toujours, mais les vues ne doivent pas traiter les modèles directement. – EmFi

+0

Je vois le point sur le filtre avant, mais je pense que je préfère réellement la logique dans la vue cette fois.Dans mon esprit, il est beaucoup plus propre et plus révélateur qu'un filtre avant dans le contrôleur d'application où vous pourriez finir par vous gratter la tête plus tard en lisant le code se demandant d'où vient la variable @comments. Au moins, si vous allez mettre le filtre dans le contrôleur d'application, vous devez choisir un nom de variable unique afin de ne pas polluer l'espace de noms. Donc @recent_comments_for_layout au lieu de @comments. – mmrobins

0

J'ai tendance à utiliser une aide pour cela:

# in app/helpers/application_helper.rb: 
def sidebar_comments(force_refresh = false) 
    @sidebar_comments = nil if force_refresh 
    @sidebar_comments ||= Comment.find(:all, :order => 'created_at DESC', :limit => 10) 
    # or ||= Comment.recent.limited(10) if you are using nifty named scopes 
end 

# in app/views/layouts/application.html.erb: 
<div id='sidebar'> 
    <ul id='recent_comments'> 
    <% sidebar_comments.each do |c| %> 
     <li class='comment'> 
     <blockquote cite="<%= comment_path(c) -%>"><%= c.text -%></blockquote> 
     </li> 
    <% end %> 
    </ul> 
</div> 
Questions connexes