W poprzedniej iteracji, Dodawanie uwierzytelniania RESTful, do bloga dodano uwierzytelnianie, aby tylko autoryzowani użytkownicy mogli tworzyć posty na blogu. Ta iteracja doda ostatnią (i główną) funkcję samouczka blogu: komentarze. Po zakończeniu tego samouczka użytkownicy będą mogli dodawać anonimowe komentarze do postów na blogu bez logowania.
Tworzenie tabel bazy danych komentarzy i kontrolera odbywa się w podobny sposób, jak tabele bazy danych postów i kontrolera zostały utworzone - przy użyciu generatora rusztowań. Generator rusztowania utworzy kontrolery RESTful, mapuje trasy i tworzy migracje baz danych. Ale zanim się na to zdecydujesz, musisz pomyśleć o tym, co to jest komentarz i kim będą jego członkowie danych. Komentarz ma:
Po ustaleniu, kim są członkowie danych komentarza, możesz uruchomić generator rusztowań. Zauważ, że pole postu jest typu „referencje”. Jest to specjalny typ, który wygeneruje pole ID, aby połączyć tabelę komentarzy z tabelą postów za pomocą klucza obcego.
Po wygenerowaniu kontrolerów i migracji możesz rozpocząć migrację, uruchamiając zadanie rake db: migrate.
Po utworzeniu tabel bazy danych możesz rozpocząć konfigurowanie modelu. W modelu, takie jak sprawdzanie poprawności danych - w celu zapewnienia obecności wymaganych pól - i można zdefiniować relacje. Zostaną wykorzystane dwie relacje.
Wpis na blogu ma wiele komentarzy. Relacja has_many nie wymaga żadnych specjalnych pól w tabeli postów, ale tabela komentarzy ma post_id, aby połączyć ją z tabelą postów. Od Szyny, możesz powiedzieć coś takiego @wstawiać komentarze aby uzyskać listę obiektów komentarzy należących do obiektu @post. Komentarze są również zależny na ich nadrzędnym obiekcie Post. Jeśli obiekt Post zostanie zniszczony, wszystkie potomne obiekty komentarzy również powinny zostać zniszczone.
Komentarz należy do obiektu postu. Komentarz może być powiązany tylko z jednym postem na blogu. Relacja nalezy do wymaga tylko jednego pola post_id znajdującego się w tabeli komentarzy. Aby uzyskać dostęp do obiektu nadrzędnego komentarza komentarza, możesz powiedzieć coś takiego @ comment.post w szynach.
Poniżej przedstawiono modele Post i Comment. Do modelu komentarzy dodano kilka sprawdzeń poprawności, aby użytkownicy mogli wypełnić wymagane pola. Zwróć również uwagę na relacje has_many i należy do.
Kontroler komentarzy nie będzie używany w tradycyjny sposób jak kontroler RESTful. Po pierwsze, będzie dostępny wyłącznie z widoków postów. Formularze komentarzy i wyświetlanie są całkowicie w akcji pokazowej kontrolera Post. Na początek usuń całość aplikacja / widoki / komentarze katalog, aby usunąć wszystkie widoki komentarzy. Nie będą potrzebne.
Następnie musisz usunąć niektóre działania z kontrolera Komentarze. Wszystko czego potrzeba to Stwórz i zniszczyć działania. Wszystkie pozostałe 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 on przekierować do kontrolera komentarzy. Gdziekolwiek występuje przekierowanie_do, zmień je na redirect_to (@ comment.post). Poniżej znajduje się pełny kontroler komentarzy.
Jednym z ostatnich elementów, które należy wprowadzić, jest formularz komentarzy, który w rzeczywistości jest dość prostym zadaniem. Zasadniczo są dwie rzeczy do zrobienia: utwórz nowy obiekt Comment w akcji show kontrolera wpisów i wyświetl formularz, który podda się akcji tworzenia kontrolera komentarzy. Aby to zrobić, zmodyfikuj akcję show w kontrolerze postów, aby wyglądała następująco. Dodana linia jest pogrubiona.
Ostatnim krokiem jest wyświetlenie komentarze. Podczas wyświetlania danych wejściowych użytkownika należy zachować ostrożność, ponieważ użytkownik może próbować wstawić tagi HTML, które mogą zakłócić działanie strony. Aby temu zapobiec, h metoda jest używana. Ta metoda pozwoli uniknąć znaczników HTML, które użytkownik próbuje wprowadzić. W dalszej iteracji można zastosować język znaczników, taki jak RedCloth lub metoda filtrowania, aby umożliwić użytkownikom publikowanie określonych tagów HTML.
Komentarze będą wyświetlane częściowo, tak jak posty. 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 usunąć komentarz, wyświetli również link Destroy, aby zniszczyć komentarz.
Na koniec, aby wyświetlić wszystkie komentarze do wpisu jednocześnie, wywołaj je częściowo za pomocą : collection => @ post.comments. To spowoduje, że komentarze będą częściowe dla każdego komentarza należącego do posta. Dodaj następujący wiersz do widoku pokazu w kontrolerze postów.
W następnej iteracji samouczka simple_format zostanie zastąpiony bardziej złożonym silnikiem formatowania o nazwie RedCloth. RedCloth pozwala użytkownikom tworzyć treści za pomocą łatwych znaczników, takich jak * pogrubienie * dla pogrubienia i _italic_ dla kursywy. Będzie to dostępne zarówno dla posterów blogów, jak i komentujących.