2016-05-25 11 views
2

Ich versuche, alle Posts anzuzeigen, die ich vom aktuellen Benutzer mag.So zeigen Sie alle meine Posts, die von Benutzer gemocht werden

Ich benutze Ruby on Rails, und die Edelsteine ​​Devise und "Acts As Votable". Ich habe the Acts As Votable guide verfolgt, kann aber nicht funktionieren.

Ich denke, das ist der Weg zu gehen:

@post.liked_by @user1 
@post.downvote_from @user2 

ich einen neuen Controller erstellt namens Dashboard:

class DashboardController < ApplicationController 
    def index 
     @post = Post.all.liked_by current_user 
    end 
end 

Aber wenn ich meine Web laufen bekomme ich:

undefined method `liked_by' for #<Post::ActiveRecord_Relation:0x9aa89b0> 

Was kann ich tun?

Antwort

2

Das Problem ist, dass Sie es auf eine ActiveRecord Relation aufrufen, nicht auf das Modellobjekt selbst. Ein paar kleine Änderungen, und Sie werden fertig sein.

Zuerst machen wir die Instanzvariable Plural zu zeigen, dass es mehrere Datensätze ist Empfangen (ein Benutzer kann mehrere Beiträge mögen):

class DashboardController < ApplicationController 
    def index 
    @posts = Post.all.liked_by current_user 
    end 
end 

Dann werden diese zu verarbeiten, Sie wollen auf den einzelnen navigieren Aufzeichnung oder Aufzeichnungen. Wenn Sie die gesamte Liste bearbeiten möchten, können Sie dies tun:

@posts.each do |post| 
    post.liked_by @user1 
    post.downvote_from @user2 
end 

Dies wird dergleichen anzuwenden und alle die Beiträge downvote. Sie können jedoch nur den ersten Beitrag, wie Sie dieses Update:

post = @posts.first 
post.liked_by @user1 
post.downvote_from @user2 

Wenn Sie bereits wusste, was Beitrag, den Sie (basierend auf dem vielleicht wurde in der Benutzeroberfläche gewählt) abstimmen wollen, können Sie dies tun:

Wenn Sie sicherstellen, dass Ihre Plural- und Singularnamen eindeutig sind, können Sie die Rails-Konventionen einhalten und leichter erkennen, wann Sie mit einer Sammlung oder einem einzelnen Objekt arbeiten.

+0

funktioniert meine Antwort nicht? Ich denke, dass der Edelstein bereits für diese Funktionalität sorgt (laut meiner Antwort), aber ich habe das nicht selbst getestet. Wenn ich recht habe, wäre das ein viel besserer Weg. – Andy

+0

@Andy Der OP hatte Schwierigkeiten beim Abfragen. Der Fehler, auf den ich im ersten Satz meiner Antwort hingewiesen habe, ist, dass er versucht, eine Modellmethode ('miked_by' von' acts_as_votable') für eine Sammlung zu verwenden, nicht das von ihm beabsichtigte Modellobjekt. Dies ist wie der Versuch, 'String # gsub' für ein Array zu verwenden, das Strings enthält - die Methode wird für das falsche Objekt verwendet. Ihre Antwort, obwohl sie möglicherweise für eine * andere * Frage korrekt ist, hat keinen Einfluss auf * diese * Frage. Sie beschreiben, wie Sie gewählte Artikel konfigurieren und abrufen können, und dies ist eindeutig nicht das Problem, nach dem das OP fragt. –

+0

"Ich versuche alle Posts zu zeigen, die ich vom aktuellen Benutzer mag."Das hört sich so an, als würde er versuchen, alle Posts aus der Datenbank abzurufen, die von" current_user "" gemocht "wurden. Ich bin verwirrt, warum er Ihre Antwort als die beste ausgewählt hat - macht noch weniger Sinn, da er das auch gesagt hat Meine Antwort 'funktioniert auch', aber unsere Antworten machen zwei völlig verschiedene Dinge. – Andy

2

versuchen Sie @posts = current_user.find_up_voted_items in Ihrem Controller und Put acts_as_voter in Ihrem Benutzermodell.

+0

Dieser funktioniert auch. Vielen Dank, Andy. –

+0

@EzequielRamiro Wenn das funktioniert, ist es sicherlich besser als die andere Antwort? Sie möchten alle Posts anzeigen, die von 'current_user' gemocht wurden - dies wird erreicht. Die beste Antwort, die Sie gewählt haben, beschreibt, wie Sie Beiträge "mögen". Soweit ich das beurteilen kann, ist das etwas ganz anderes als das, was Sie in der ursprünglichen Frage gefordert haben. – Andy