Zezwalanie na komentarze w Ruby on Rails

01 z 07

Zezwalanie na komentarze

Blogowanie na zewnątrz w lokalizacjilechatnoir/E+/Getty Images





' id='mntl-sc-block-image_2-0-1' />

lechatnoir/E+/Getty Images



W poprzedniej iteracji, Dodawanie uwierzytelniania RESTful, do bloga dodano uwierzytelnianie, dzięki czemu tylko autoryzowani użytkownicy mogli tworzyć posty w blogu. Ta iteracja doda ostatnią (i główną) funkcję samouczka bloga: komentarze. Po ukończeniu tego samouczka użytkownicy będą mogli publikować anonimowe komentarze do postów na blogu bez logowania.

02 z 07

Rusztowanie Komentarze

Tworzenie tabel bazy danych komentarzy i kontrolera odbywa się w podobny sposób, w jaki stworzono tabele bazy danych postów i kontroler — przy użyciu generatora rusztowań. Generator rusztowań utworzy kontrolery RESTful, mapuje trasy i stworzy migracje baz danych. Ale zanim się tym zajmiesz, musisz pomyśleć o tym, czym jest komentarz i jacy będą jego członkowie. Komentarz zawiera:



    Imię i nazwisko (pole wymagane): Nazwa komentatora jako ciąg.E-mail (pole opcjonalne): E-mail komentującego jako ciąg.Treść (pole wymagane): Treść komentarza jako tekst.Poczta: To kojarzy komentarz z konkretnym wpisem na blogu. Jest to wymagane dla ma wiele oraz należy do wspomnienia.

Po ustaleniu, jakie są elementy danych komentarza, możesz uruchomić generator rusztowań. Zwróć uwagę, że pole wpisu jest typu „referencje”. Jest to specjalny typ, który wygeneruje pole identyfikatora, aby połączyć tabelę komentarzy z tabelą postów za pomocą klucza obcego.

$ skrypt/generuj rusztowanie komentarz name:string email:string body:text post:referencje
istnieje aplikacja/modele/
istnieje aplikacja/kontrolery/
istnieje aplikacja/pomocnicy/
... wyciąć ...

Po wygenerowaniu kontrolerów i migracji można kontynuować migrację, uruchamiając zadanie db:migrate rake.

$ rake db:migrate
== 20080724173258 Utwórz komentarze: migracja ========
-- utwórz_tablicę(:komentarze)
-> 0,0255s
== 20080724173258 CreateComments: migrowane (0.0305s)
03 z 07

Konfiguracja modelu

Po umieszczeniu tabel bazy danych możesz rozpocząć konfigurowanie modelu. W modelu można zdefiniować takie rzeczy, jak sprawdzanie poprawności danych — aby upewnić się, że wymagane pola są obecne — oraz można zdefiniować relacje. Wykorzystane zostaną dwie relacje.

Wpis na blogu zawiera wiele komentarzy. Relacja has_many nie wymaga żadnych specjalnych pól w tabeli posts, ale tabela komentarzy ma identyfikator post_id, który łączy ją z tabelą posts. Z Szyny , możesz mówić takie rzeczy jak @wstawiać komentarze aby uzyskać listę obiektów Comment, które należą do obiektu @post. Komentarze są również zależny na ich nadrzędnym obiekcie Post. Jeśli obiekt Post zostanie zniszczony, wszystkie obiekty komentarzy podrzędnych również powinny zostać zniszczone.



Komentarz należy do obiektu posta. Komentarz może być powiązany tylko z jednym postem na blogu. Relacja entity_to wymaga, aby w tabeli komentarzy znajdowało się tylko jedno pole post_id. Aby uzyskać dostęp do obiektu nadrzędnego wpisu komentarza, możesz powiedzieć coś takiego: @komentarz.post w szynach.

Poniżej przedstawiono modele postów i komentarzy. Do modelu komentarzy dodano kilka walidacji, aby upewnić się, że użytkownicy wypełniają wymagane pola. Zwróć także uwagę na relacje has_many i familiar_to.



# Plik: app/models/post.rb
klasa Post has_many :comments, :dependent => :destroy
koniec
# Plik: app/models/comment.rb
klasa Komentarz należy_do :post
validates_presence_of :nazwa
validates_length_of :name, :within => 2..20
validates_presence_of: ciało
koniec
04 z 07

Przygotowanie kontrolera komentarzy

Kontroler komentarzy nie będzie używany w tradycyjny sposób, jak używany jest kontroler RESTful. Po pierwsze, dostęp do niego będzie możliwy wyłącznie z widoków postów. Formularze komentarzy i wyświetlanie znajdują się w całości w akcji show kontrolera Post. Na początek usuń całość aplikacja/wyświetlenia/komentarze katalogu, aby usunąć wszystkie widoki komentarzy. Nie będą potrzebne.

Następnie musisz usunąć niektóre akcje z kontrolera Komentarze. Wszystko, co jest potrzebne, to Stwórz oraz zniszczyć działania. Wszystkie inne działania można usunąć. Ponieważ kontroler komentarzy jest teraz tylko skrótem bez widoków, musisz zmienić kilka miejsc w kontrolerze, w których próbuje przekierować do kontrolera komentarzy. Wszędzie tam, gdzie jest przekierowanie do połączenia, zmień je na przekierowanie_do(@komentarz.post) . Poniżej znajduje się kompletny kontroler komentarzy.



# Plik: app/controllers/comments_controller.rb
klasa KomentarzeKontroler definiuj tworzenie
@komentarz = Komentarz.nowy(parametry[:komentarz])
jeśli @komentarz.zapisz
;flash[:notice] = 'Komentarz został pomyślnie utworzony.'
przekierowanie_do(@komentarz.post)
w przeciwnym razie
flash[:notice] = 'Błąd tworzenia komentarza: #{@comment.errors}'
przekierowanie_do(@komentarz.post)
koniec
koniec
definitywnie zniszczyć
@komentarz = Komentarz.znajdź(parametry[:id])
@komentarz.zniszcz
przekierowanie_do(@komentarz.post)
koniec
koniec
05 z 07

Formularz komentarzy

Jednym z ostatnich elementów, które należy wprowadzić, jest formularz komentarzy, co w rzeczywistości jest dość prostym zadaniem. Zasadniczo są dwie rzeczy do zrobienia: utworzenie nowego obiektu Comment w akcji show kontrolera postów i wyświetlenie formularza, który zostanie przesłany do akcji create kontrolera Comments. Aby to zrobić, zmodyfikuj akcję show w kontrolerze postów tak, aby wyglądała jak poniżej. Dodana linia jest pogrubiona.

# Plik: app/controllers/posts_controller.rb
# GET /posty/1
# GET /posts/1.xml
def pokaż
@post = Post.find(params[:id])
@comment = Komentarz.nowy( :post => @post )

Wyświetlanie formularza komentarzy jest takie samo, jak każdego innego formularza. Umieść to na dole widoku dla akcji show w kontrolerze postów.



06 z 07

Wyświetlanie komentarzy

Ostatnim krokiem jest faktyczne wyświetlenie uwagi . Należy zachować ostrożność podczas wyświetlania danych wejściowych użytkownika, ponieważ użytkownik może próbować wstawić tagi HTML, które mogłyby zakłócić działanie strony. Aby temu zapobiec, h stosowana jest metoda. Ta metoda spowoduje uniknięcie wszelkich znaczników HTML, które użytkownik próbuje wprowadzić. W kolejnej iteracji można zastosować język znaczników, taki jak RedCloth lub metodę filtrowania, aby umożliwić użytkownikom publikowanie określonych znaczników HTML.

Komentarze będą wyświetlane z częściami, tak jak w przypadku postów. Utwórz plik o nazwie app/views/posts/_comment.html.erb i umieść w nim następujący tekst. Wyświetli komentarz, a jeśli użytkownik jest zalogowany i może go usunąć, wyświetli również link Destroy, aby zniszczyć komentarz.


mówi:
:confirm => 'Jesteś pewien?',
:method => :usunąć jeśli zalogowany? %>

Na koniec, aby wyświetlić wszystkie komentarze do wpisu naraz, nazwij komentarze częściowymi za pomocą :kolekcja => @post.comments . Spowoduje to, że komentarze będą częściowe dla każdego komentarza, który należy do posta. Dodaj następujący wiersz do widoku pokazu w kontrolerze postów.

'comment', :collection => @post.comments %>

Gdy to się stanie, zaimplementowany zostanie w pełni funkcjonalny system komentarzy.

07 z 07

Następna iteracja

W następnej iteracji samouczka simple_format zostanie zastąpiony bardziej złożonym silnikiem formatowania o nazwie RedCloth. RedCloth umożliwia użytkownikom tworzenie treści z łatwymi znacznikami, takimi jak *pogrubienie* dla pogrubienia i _kursywa_ dla kursywy. Będzie to dostępne zarówno dla autorów bloga, jak i komentatorów.