В предыдущей итерации, добавляя аутентификацию RESTful, аутентификация была добавлена в ваш блог, поэтому только авторизованные пользователи могли создавать сообщения в блоге. Эта итерация добавит заключительную (и основную) особенность учебника блога: комментарии. После прочтения этого руководства пользователи смогут оставлять анонимные комментарии в сообщениях блога без входа в систему.
Создание таблиц базы данных комментариев и контроллера выполняется практически так же, как были созданы таблицы базы данных сообщений и контроллер - с помощью генератора скаффолдов. Генератор скаффолда создаст контроллеры RESTful, отобразит маршруты и создаст миграцию базы данных. Но прежде, чем вы это сделаете, вы должны подумать о том, что такое комментарий и каковы будут его члены. Комментарий имеет:
После того, как вы определились, что представляют собой члены данных комментария, вы можете запустить генератор скаффолдов. Обратите внимание, что поле пост имеет тип «ссылки». Это специальный тип, который генерирует поле идентификатора, чтобы связать таблицу комментариев с таблицей сообщений через внешний ключ.
После генерации контроллеров и миграций вы можете продолжить миграцию, запустив задачу rab db: migrate.
Как только таблицы базы данных будут созданы, вы можете приступить к настройке модели. В модели такие вещи, как валидация данных - чтобы гарантировать наличие обязательных полей - и отношения могут быть определены. Будут использованы два отношения.
В блоге есть много комментариев. Отношение has_many не требует специальных полей в таблице публикаций, но в таблице комментариев есть post_id, чтобы связать его с таблицей сообщений. Из Рельсыможно сказать что-то вроде @ post.comments чтобы получить список объектов Comment, которые принадлежат объекту @post. Комментарии также зависимый на их родительском объекте Post. Если объект Post уничтожен, все дочерние объекты комментариев также должны быть уничтожены.
Комментарий принадлежит объекту публикации. Комментарий может быть связан только с одним сообщением в блоге. Для отношения принадлежащих вам требуется только одно поле post_id в таблице комментариев. Чтобы получить доступ к родительскому объекту публикации комментария, вы можете сказать что-то вроде @ comment.post в рельсах.
Ниже приведены модели Post и Comment. Несколько проверок были добавлены в модель комментариев, чтобы гарантировать, что пользователи заполняют обязательные поля. Обратите внимание также на отношения has_many и own_to.
Контроллер комментариев не будет использоваться традиционным способом, как контроллер RESTful. Во-первых, он будет доступен исключительно из представлений постов. Формы комментариев и их отображение полностью находятся в действии show контроллера Post. Итак, для начала удалите весь приложение / просмотров / комментарии каталог для удаления всех просмотров комментариев. Они не будут нужны.
Далее вам нужно удалить некоторые действия из контроллера комментариев. Все, что нужно, это Создайте и уничтожить действия. Все остальные действия могут быть удалены. Поскольку контроллер Comments теперь является просто заглушкой без представлений, вам нужно изменить несколько мест в контроллере, где он пытается перенаправить на контроллер комментариев. Везде, где есть вызов redirect_to, измените его на redirect_to (@ comment.post). Ниже приведен полный контроллер комментариев.
Одна из заключительных частей, которую нужно поставить на место, - это форма комментариев, которая на самом деле является довольно простой задачей. В основном нужно сделать две вещи: создать новый объект Comment в действии show контроллера posts и отобразить форму, которая подчиняется действию create контроллера Comments. Для этого измените действие show в контроллере posts, чтобы оно выглядело следующим образом. Добавленная строка выделена жирным шрифтом.
Последний шаг - отобразить Комментарии. При отображении введенных пользователем данных необходимо соблюдать осторожность, поскольку пользователь может попытаться вставить теги HTML, которые могут нарушить работу страницы. Чтобы предотвратить это, час метод используется. Этот метод будет экранировать любые теги HTML, которые пользователь пытается ввести. На следующей итерации можно применить язык разметки, такой как RedCloth или метод фильтрации, чтобы позволить пользователям публиковать определенные теги HTML.
Комментарии будут отображаться с частичным, так же, как и сообщения. Создайте файл с именем приложение / просмотров / сообщений / _comment.html.erb и поместите в него следующий текст. Он будет отображать комментарий и, если пользователь вошел в систему и может удалить комментарий, также отобразит ссылку «Удалить», чтобы удалить комментарий.
Наконец, чтобы отобразить сразу все комментарии к записи, вызовите частичные комментарии с помощью : collection => @ post.comments. Это вызовет частичные комментарии для каждого комментария, который принадлежит посту. Добавьте следующую строку в представление show в контроллере сообщений.
В следующей итерации учебника simple_format будет заменен более сложным механизмом форматирования под названием RedCloth. RedCloth позволяет пользователям создавать контент с простой разметкой, такой как * жирный шрифт * для жирного шрифта и _italic_ для курсива. Это будет доступно как постерам, так и комментаторам.