Computerwissenschaften

Zulassen von Kommentaren zu Ruby on Rails

Zulassen von Kommentaren zu Ruby on Rails

01 von 07

Zulassen von Kommentaren

lechatnoir / E + / Getty Images

 

In der vorherigen Iteration, Hinzufügen einer RESTful-Authentifizierung, wurde Ihrem Blog eine Authentifizierung hinzugefügt, sodass nur autorisierte Benutzer Blog-Beiträge erstellen konnten. Diese Iteration fügt die letzte (und wichtigste) Funktion des Blog-Tutorials hinzu: Kommentare. Nachdem Sie mit diesem Tutorial fertig sind, können Benutzer anonyme Kommentare zu Blog-Posts veröffentlichen, ohne sich anzumelden.

02 von 07

Gerüst die Kommentare

Das Erstellen der Kommentar-Datenbanktabellen und des Controllers erfolgt auf die gleiche Weise wie die Post-Datenbanktabellen und der Controller – mithilfe des Gerüstgenerators. Der Gerüstgenerator erstellt RESTful-Controller, ordnet Routen zu und erstellt Datenbankmigrationen. Bevor Sie dies jedoch übernehmen, müssen Sie sich überlegen, was ein Kommentar ist und welche Datenelemente er enthält. Ein Kommentar hat:

  • Name (erforderliches Feld) : Der Name des Kommentators als Zeichenfolge.
  • E-Mail (optionales Feld) : Die E-Mail des Kommentators als Zeichenfolge.
  • Text (erforderliches Feld) : Der Text des Kommentars als Text.
  • Beitrag : Dies ordnet den Kommentar einem bestimmten Blog-Beitrag zu. Dies ist für die has_many erforderlich und gehört zu den Assoziationen.

Sobald Sie die Datenelemente eines Kommentars festgelegt haben, können Sie den Gerüstgenerator ausführen. Beachten Sie, dass das Post-Feld vom Typ „Referenzen“ ist. Dies ist ein spezieller Typ, der ein ID-Feld generiert, um die Kommentartabelle über einen Fremdschlüssel mit der Beitragstabelle zu verknüpfen.

$ script / Gerüstkommentar generieren Name: String E-Mail: String Body: Text Post: Referenzen
existiert App / Modelle /
existiert App / Controller /
existiert App / Helfer /
… snip …

Sobald die Controller und Migrationen generiert wurden, können Sie die Migration ausführen, indem Sie die Rake-Task db: migrate ausführen.

$
rake db: migrate == 20080724173258 CreateComments: migrating ========
– create_table (: Kommentare)
-> 0.0255s
== 20080724173258 CreateComments: migriert (0.0305s)

03 von 07

Modell einrichten

Sobald die Datenbanktabellen vorhanden sind, können Sie mit dem Einrichten des Modells beginnen. Im Modell können beispielsweise Datenvalidierungen – um sicherzustellen, dass die erforderlichen Felder vorhanden sind – und Beziehungen definiert werden. Es werden zwei Beziehungen verwendet.

Ein Blog-Beitrag hat viele Kommentare. Die Beziehung has_many erfordert keine speziellen Felder in der Posts-Tabelle, aber die Kommentartabelle verfügt über eine post_id, um sie mit der Posts-Tabelle zu verknüpfen. In Rails können Sie beispielsweise @ post.comments sagen , um eine Liste der Kommentarobjekte abzurufen, die zum @ post-Objekt gehören. Kommentare hängen auch vom übergeordneten Post-Objekt ab. Wenn das Post-Objekt zerstört wird, sollten auch alle untergeordneten Kommentarobjekte zerstört werden.

Ein Kommentar gehört zu einem Post-Objekt. Ein Kommentar kann nur einem einzelnen Blog-Beitrag zugeordnet werden. Für die Beziehung „zu“ gehört nur ein einzelnes Feld „post_id“ in der Kommentartabelle. Um auf das übergeordnete Post-Objekt eines Kommentars zuzugreifen, können Sie in Rails so etwas wie @ comment.post sagen .

Im Folgenden sind die Post- und Comment-Modelle aufgeführt. Dem Kommentarmodell wurden mehrere Validierungen hinzugefügt, um sicherzustellen, dass Benutzer die erforderlichen Felder ausfüllen. Beachten Sie auch die Beziehungen has_many und Zugehörigkeit zu.

# Datei: app / models / post.rb
Klasse Post <
ActiveRecord :: Base has_many: Kommentare ,: abhängig =>:
Ende zerstören

# Datei: app / models / comment.rb
Klasse Kommentar <
ActiveRecord :: Base gehört zu: post
validates_presence_of: name
validates_length_of: name ,: inside => 2..20
validates_presence_of: body
end

04 von 07

Vorbereiten des Kommentar-Controllers

Der Kommentar-Controller wird nicht auf die herkömmliche Weise verwendet, wie ein RESTful-Controller verwendet wird. Erstens wird ausschließlich über die Post-Ansichten darauf zugegriffen. Die Kommentarformulare und die Anzeige befinden sich vollständig in der Show-Aktion des Post-Controllers. Löschen Sie zunächst das gesamte Verzeichnis app / views / comment, um alle Kommentaransichten zu löschen. Sie werden nicht benötigt.

Als Nächstes müssen Sie einige der Aktionen aus dem Kommentar-Controller löschen. Alles, was benötigt wird, ist das Erstellen und Zerstören von Aktionen. Alle anderen Aktionen können gelöscht werden. Da der Kommentar-Controller nur noch ein Stub ohne Ansichten ist, müssen Sie einige Stellen im Controller ändern, an denen versucht wird, zum Kommentar-Controller umzuleiten. Wenn ein redirect_to-Aufruf vorhanden ist, ändern Sie ihn in redirect_to (@ comment.post) . Unten finden Sie den vollständigen Kommentar-Controller.

# Datei:
Klasse app / controller / comment_controller.rb CommentsController def create
@comment=Comment.new (params [: comment])
if @ comment.save
; flash [: Notice]=’Kommentar wurde erfolgreich erstellt.‘
redirect_to (@ comment.post)
else
flash [: Notice]=“Fehler beim Erstellen des Kommentars: #{@comment.errors}“
redirect_to (@ comment.post)
end
end
def destroy
@comment=Comment.find (params [: id] )
@ comment.destroy
redirect_to (@ comment.post)
end
end

05 von 07

Das Kommentarformular

Eines der letzten Elemente, das umgesetzt werden muss, ist das Kommentarformular, was eigentlich eine ziemlich einfache Aufgabe ist. Grundsätzlich sind zwei Dinge zu tun: Erstellen Sie ein neues Kommentarobjekt in der Show-Aktion des Posts-Controllers und zeigen Sie ein Formular an, das an die Erstellungsaktion des Comments-Controllers gesendet wird. Ändern Sie d
azu die Show-Aktion im Posts-Controller wie folgt. Die hinzugefügte Zeile ist fett gedruckt.

# Datei: app / controller / posts_controller.rb
# GET / posts / 1
# GET /posts/1.xml
def show
@post=Post.find (params [: id])
@comment=Comment.new (: post => @post)

Das Anzeigen des Kommentarformulars ist mit jedem anderen Formular identisch. Platzieren Sie diese am unteren Rand der Ansicht für die Show-Aktion im Posts-Controller.

06 von 07

Anzeigen der Kommentare

Der letzte Schritt besteht darin, die Kommentare tatsächlich anzuzeigen . Bei der Anzeige von Benutzereingabedaten ist Vorsicht geboten, da ein Benutzer möglicherweise versucht, HTML-Tags einzufügen, die die Seite stören könnten. Um dies zu verhindern, wird die h- Methode verwendet. Diese Methode entgeht allen HTML-Tags, die der Benutzer einzugeben versucht. In einer weiteren Iteration könnte eine Auszeichnungssprache wie RedCloth oder eine Filtermethode angewendet werden, damit Benutzer bestimmte HTML-Tags veröffentlichen können.

Kommentare werden mit einem Teil angezeigt, genau wie Beiträge. Erstellen Sie eine Datei mit dem Namen app / views / posts / _comment.html.erb und fügen Sie den folgenden Text ein. Der Kommentar wird angezeigt. Wenn der Benutzer angemeldet ist und den Kommentar löschen kann, wird auch der Link Zerstören angezeigt, um den Kommentar zu zerstören.

sagt
:: bestätige => ‚Bist du sicher?‘ ,
: method =>: löschen wenn angemeldet? %>

Um schließlich alle Kommentare eines Posts auf einmal anzuzeigen, rufen Sie die Kommentare teilweise mit folgender Adresse auf: collection => @ post.comments . Dadurch werden die Kommentare für jeden Kommentar, der zum Beitrag gehört, teilweise aufgerufen. Fügen Sie der Show-Ansicht im Posts-Controller die folgende Zeile hinzu.

‚Kommentar‘ ,: Sammlung => @ post.comments%>

Wenn dies erledigt ist, wird ein voll funktionsfähiges Kommentarsystem implementiert.

07 von 07

Nächste Iteration

In der nächsten Tutorial-Iteration wird simple_format durch eine komplexere Formatierungs-Engine namens RedCloth ersetzt. Mit RedCloth können Benutzer Inhalte mit einfachem Markup erstellen, z. B. * fett * für fett und _italic_ für kursiv. Dies steht sowohl Blog-Postern als auch Kommentatoren zur Verfügung.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.