V předchozí iteraci, přidání RESTful autentizace, byla do vašeho blogu přidána autentizace, takže pouze autorizovaní uživatelé mohli vytvářet blogové příspěvky. Tato iterace přidá poslední (a hlavní) funkci blogového tutoriálu: komentáře. Po dokončení tohoto tutoriálu budou uživatelé moci zveřejňovat anonymní komentáře k blogovým příspěvkům bez přihlášení.
Vytváření databázových tabulek a řadičů komentářů se provádí hodně stejným způsobem, jakým byly vytvořeny databázové tabulky a řadiče příspěvků - pomocí generátoru lešení. Generátor lešení vytvoří RESTful řadiče, mapuje trasy a vytvoří migrace databáze. Ale předtím, než se k tomu dostanete, musíte přemýšlet o tom, co je to komentář a jaké budou jeho datové členy. Komentář má:
Jakmile se rozhodnete, jaké jsou datové členy komentáře, můžete spustit generátor lešení. Pole post je typu "reference". Toto je speciální typ, který vygeneruje pole ID pro propojení tabulky komentářů s tabulkou příspěvků pomocí cizího klíče.
Jakmile jsou generovány řadiče a migrace, můžete pokračovat a spustit migraci spuštěním úlohy db: migrate rake.
Jakmile jsou databázové tabulky na místě, můžete začít s nastavením modelu. V modelu lze definovat věci jako ověření dat - aby se zajistilo, že jsou k dispozici povinná pole - a lze definovat vztahy. Budou použity dva vztahy.
Blogový příspěvek obsahuje mnoho komentářů. Vztah has_many nevyžaduje žádná speciální pole v tabulce příspěvků, ale tabulka komentářů má post_id, který ji propojí s tabulkou příspěvků. Z Kolejnice, můžete říci věci jako @ post.comments získat seznam objektů Comment, které patří k objektu @post. Komentáře jsou také závislý na jejich rodičovském objektu Post. Pokud je objekt Post zničen, měly by být zničeny také všechny objekty podřízených komentářů.
Komentář patří k poštovnímu objektu. Komentář může být spojen pouze s jedním příspěvkem na blogu. Vztah patr_to vyžaduje pouze jedno pole post_id, které má být v tabulce komentářů. Chcete-li získat přístup k objektu rodičovského příspěvku komentáře, můžete říct něco jako @ comment.post v Rails.
Níže jsou uvedeny modely Post a Comment. Do modelu komentářů bylo přidáno několik ověření, aby se zajistilo, že uživatelé vyplní požadovaná pole. Všimněte si také vztahů has_many a patří_to.
Řadič komentářů nebude používán tradičním způsobem, který je používán RESTful řadič. Za prvé, bude přístupná pouze z pohledů Post. Formuláře komentáře a zobrazení jsou zcela v akci show řadiče Post. Chcete-li tedy začít, smažte celý aplikace / zobrazení / komentáře adresář pro odstranění všech zobrazení komentářů. Nebudou potřeba.
Dále je třeba odstranit některé akce z řadiče komentářů. Vše, co je potřeba, je vytvořit a zničit akce. Všechny ostatní akce lze smazat. Protože řadič Comments je nyní jen útržek bez zobrazení, musíte změnit několik míst v řadiči, kde se pokusí přesměrovat na řadič Comments. Kdekoli dojde k přesměrování, změňte jej na redirect_to (@ comment.post). Níže je uveden kompletní řadič komentářů.
Jedním z posledních kusů, které je třeba uvést, je formulář komentářů, což je ve skutečnosti poměrně jednoduchý úkol. V zásadě je třeba udělat dvě věci: vytvořit nový objekt Komentář v akci show řadiče příspěvků a zobrazit formulář, který se odešle k vytvoření akce řadiče komentářů. Chcete-li tak učinit, upravte akci show v řadiči příspěvků tak, aby vypadala následovně. Přidaný řádek je tučně.
Posledním krokem je zobrazení komentáře. Při zobrazování vstupních dat uživatele je třeba postupovat opatrně, protože uživatel by se mohl pokusit vložit značky HTML, které by mohly stránku narušit. Chcete-li tomu zabránit, h používá se metoda. Tato metoda unikne všem značkám HTML, které se uživatel pokusí zadat. V další iteraci lze použít značkovací jazyk, jako je RedCloth nebo metoda filtrování, aby uživatelé mohli zveřejňovat určité značky HTML.
Komentáře budou zobrazeny s částečnými, stejně jako příspěvky. Vytvořte soubor s názvem app / views / posts / _comment.html.erb a vložte do ní následující text. Zobrazí komentář a pokud je uživatel přihlášen a může jej odstranit, zobrazí také odkaz Zničit a komentář se zničí.
Nakonec, chcete-li zobrazit všechny komentáře příspěvku najednou, zavolejte komentáře částečně : collection => @ post.comments. Toto označí komentáře jako částečné pro každý komentář, který patří k příspěvku. Přidejte následující řádek do zobrazení zobrazení v řadiči příspěvků.
V další iteraci tutoriálu bude simple_format nahrazen složitějším formátovacím modulem nazvaným RedCloth. RedCloth umožňuje uživatelům vytvářet obsah pomocí jednoduchých značek, například * tučně * pro tučné písmo a _italic_ pro kurzívu. Bude k dispozici jak blogovým plakátům, tak i komentátorům.