2010-10-11 3 views
3

Le site est une communauté simple où chaque utilisateur crée des publications et les utilisateurs peuvent les "aimer" ou les "dissocier".Ajout d'un bouton "J'aime/Contrairement" à un message dans Rails

J'ai un modèle Post et un modèle Like. Actuellement, je suis la liste de tous les messages et aussi la taille des goûts pour chaque poste via post.likes.size. Le bouton pour aimer un post fonctionne également. Ce que je ne sais pas comment faire est de savoir comment selon le cas, si un message devrait montrer le bouton différent ou similaire (selon si l'utilisateur courant aimé déjà ce poste).

Le modèle est très simple comme:

User_id // current user 
Post_id // post to associate 

Merci à l'avance!

+0

Check this out: http://stackoverflow.com/questions/3703194/like-dislike-plugin-for-rails/3703360 # 3703360 – jpemberthy

Répondre

5

Vous devez définir l'association dans le modèle utilisateur

si elle est ROR 2. * méthode ajouter dans le modèle de l'utilisateur. il devrait ressembler à ceci:

has_many :likes 
def already_likes?(post) 
    self.likes.find(:all, :conditions => ['post_id = ?', post.id]).size > 0 
end 

En supposant Comme a des champs user_id et post_id et bien sûr en vue

if current_user.already_likes?(@post) 
    #add unlike button 
end 
+0

Solution vraiment simple et excellente. C'est celui que j'ai choisi. Merci beaucoup! – Martin

0

créez une action comme celle-ci dans votre contrôleur de posts.

def unlike 
    # get the post 
    #code to decrement the like counter of a specific post 
end 

Ensuite, à votre avis, créez un bouton ou un lien qui pointe vers cette action.

+0

Je sais cela, mais avant de montrer le bouton dissemblable, comment puis-je savoir si je l'ai déjà aimé? – Martin

1

Vous voulez rechercher un enregistrement qui correspond à la user_id et post_id. Si vous en trouvez un, vous voulez montrer le bouton "unlike", b/c qui signifie que l'utilisateur a déjà "aimé" le post. Si vous ne le faites pas (il renvoie zéro), vous voulez afficher le bouton «J'aime».

La méthode suivante renvoie un résultat nul si l'utilisateur n'a pas "aimé" le message, et non nul si l'utilisateur a "aimé" le post.

def user_likes(current_user, post_id) 
    likes.find(:first, :conditions => ['user_id = ? AND post_id = ?', current_user, post_id]).nil? 
end 

On peut donc dire:

if user_likes(1, 12).nil? 
    # show like button 
else 
    #show unlike button 
end 
+0

C'était vraiment simple et génial! Merci beaucoup. Désolé de la réponse tardive. – Martin

1

Vous pouvez également ajouter la validation à votre modèle comme comme ceci:

validate :user_does_not_already_like_post 

def user_does_not_already_like_post 
    errors.add(:user, "You can only like a post once.") if user.already_likes?(post) 
end 
Questions connexes