написать приложение ruby on rails
Ruby on Rails: Создание приложений с меньшими усилиями
Если вы разрабатываете сайты, то наверняка слышали о Ruby on Rails (RoR). Но если вы дизайнер, разработчик интерфейсов или используете PHP без какого-либо фреймворка, то изучение Ruby on Rails может показаться вам трудным. В этой статье я расскажу вам о возможностях Ruby on Rails, постараюсь убедить вас, что нет ничего сложного в переходе на Рельсы, и вы с легкостью сможете освоить их без потери большого количества времени.
Конечно, понадобится время, чтобы узнать новые способы сделать то, что вы делали с помощью другого языка программирования, узнать некоторые новые методы и понятия. На короткое время, в связи с переходом на Rails, ваша производительность снизится. Тем не менее, я уверен, что многие веб-разработчики станут более продуктивными, будут создавать более совершенные сайты и получать больше удовольствия от программирования, используя Ruby on Rails.
Работа найдется для каждого
Ruby on Rails – это «full-stack» фреймворк, который охватывает разработку интерфейса и программной части проекта. Это делает его исключительно мощным инструментом в руках веб-разработчиков. Даже если вы в первую очередь дизайнер интерфейсов или back-end разработчик, вы можете использовать Ruby on Rails достаточно эффективно. Первые для клиентской части (HTML, CSS, JavaScript), вторые – для серверной (Ruby, Rails, frameworks). Вам нет необходимости изучать обе части, вы можете сосредоточиться на какой-то одной.
Поэтому, при приближении к изучению Ruby on Rails вы должны знать, какие проекты можно реализовать с помощью данного фреймворка и языка Ruby.
Золотая середина
Ruby on Rails лежит в основе таких веб-приложений и сайтов, как Basecamp, Blinksale, Revolution Health, YellowPages.com и, конечно же, Twitter. Энтузиазм разработки на Rails распространяется во многих крупнейших интернет-компаниях. Yahoo, eBay, Amazon, AOL – все они имеют проекты на RoR, а компания ThoughtWorks занимается разработкой корпоративных приложений в среде Rails.
Повышенная производительность
Одной из основных причин повышенной производительности Ruby on Rails является то, что он позволяет создавать новые приложения без написания большого количества кода и хаков. Проще говоря, сочетание языка (Ruby) с фреймворком (Rails) означает, что вы можете делать больше с меньшим количеством кода. Небольшое количество структурированного кода позволяет относительно безболезненно вносить изменения и экспериментировать.
Конечно, изучение нового инструмента разработки требует времени. Однако, если вам нужно создать всего один проект, это не оправдано. Но если вы планируете создание сайтов в течение некоторого времени и они будут не реализуемы стандартными средствами (CMS), то имеет смысл инвестировать свое время в изучение Ruby on Rails, так как это окупится в долгосрочной перспективе.
Чтобы понять, что можно сделать больше с меньшими усилиями с использованием Ruby on Rails, давайте начнем с беглого взгляда на Ruby.
Знакомьтесь – Ruby
Хотя Ruby (язык) и Rails (framework) – разные вещи, они во многом дополняют и зависят друг от друга. Все RoR приложения написаны на Ruby и характер Ruby имеет большое влияние на Rails-приложения. Есть фреймворки, такие, как CakePHP, которые многое заимствуют из Rails. Но мощь Ruby on Rails делает приложения более чистыми и гибкими, чем многие другие фреймворки. Если вы собираетесь изучать Ruby, что не является сложным, то получите значительный выигрыш в будущем.
Rails подход
Многие веб-сайты построены без каких-либо инфраструктур для написания приложений: просто написан код, который берется из различных мест и используется там, где нужен. Это нормально для небольших сайтов, но в масштабных проектах все может выйти из-под контроля, в результате чего будет куча грязного кода, который трудно будет разобрать и поддерживать.
При использовании фреймворков, таких, как Ruby on Rails, большинство вопросов о том, как структурировать код, решено за вас. Ттакже в вашем распоряжении имеется мощный набор библиотек.
Другой важной характеристикой Rails является то, что он организует вокруг каждого приложения структуру модель-вид-контроллер (MVC). MVC предоставляет весь код в виде структуры, которая очень помогает при работе над несколькими проектами или при привлечении кого-то другого для работы над сайтом. Он также предоставляет отдельные файлы с кодом интерфейса, которые могут быть разделены между front-end и back-end разработчиками.
Базы данных и объекты
Ruby on Rails предназначен для создания приложений, взаимодействующих с базами данных. Для этого в ядре Rails предусмотрена библиотека Active Record, которая реализует то, что называется объектно-реляционным отображением (ORM). С ORM вы можете работать с объектами, предоставляющими данные, а библиотека Active Record позаботится о взаимодействии с базой данных.
Это может показаться немного непонятным, поэтому давайте разберем на примерах. Даже не зная Ruby или другой объектно-ориентированный язык, уверен, вы сможете разобрать следующие примеры Ruby on Rails кода.
Предположим, у вас есть книжный интернет-магазин, и вы хотите добавить новую книгу. Вы могли бы написать:
newbook = Book.new
Вы можете задать класс «книге», который также будет являться объектом, указав атрибут интуитивным способом «newbook.»:
newbook.title = «Программирование на языке Ruby»
newbook.author = «Хэл Фултон»
На данный момент у вас есть объект в памяти. Все это занимает:
newbook.save
Ваша новая книга была записана в базу данных. Active Record генерирует SQL-запросы к базе данных для записи новой информации. Вы можете добавить проверку всех полей и генерировать сообщения об ошибке с помощью всего лишь нескольких строк кода.
Теперь вы хотите найти эту книгу из миллионов книг в базе данных. Просто напишите:
angle_of_repose = Book.find_by_title «Программирование на языке Ruby»
И у вас есть объект, который вы назвали «angle_of_repose». Он имеет всю информацию из соответствующей записи в базе данных.
В RoR есть богатый набор программных объектов, которые соответствуют таблицам базы данных. Эти объекты составляют «модель» в системе модель-вид-контроллер.
Код взаимодействует с модельными объектами, а Active Record создает SQL-запросы. Вам не нужно писать их самостоятельно. И, поскольку, ни один фрагмент кода не связывается напрямую с базой данных, вы можете переключаться между ними путем простого изменения параметров конфигурации.
Виды и контроллеры
Для создания веб-страниц, Rails предоставляет систему шаблонов, что делает его простым в использовании, позволяет вставлять общие компоненты без повторения их кода, информацию из базы данных, а также отображать и обрабатывать формы. Эти шаблоны представляют собой «вид» в системе модель-вид-контроллер.
Если вы разработчик интерфейсов, на этой части Rails вы должны сосредоточить свое внимание. Вы можете считать, что в ваши файлы будут переданы переменные, которые содержат все сведения, необходимые для отображения. Подобно тому, как PHP-файлы сочетают в себе PHP и HTML код, типичный вид Rails представляет собой смесь Ruby и HTML. Продолжим объяснение на примере нашего интернет-магазина. Например, вот фрагмент кода, который отображает название и автора книги:
Код Ruby отмечен ; остальное HTML.
Rails имеет встроенную поддержку для Prototype и Scriptaculous JavaScript библиотек, а также объект, называемый Ruby JavaScript (RJS), для создания Ajax-интерфейсов. Вы можете написать почти все, что в Ruby, в том и числе код, который выполняется на стороне клиента, как JavaScript.
«Контроллер» является частью кода Ruby. Его основная работа заключается во взаимодействии с моделью для подготовки данных, необходимых виду». Любая информация собрана контроллером в набор переменных перед вызовом вида. Контроллер также отвечает на запросы Ajax после загрузки страницы. Контроллеры обеспечивают множество других функций – от аутентификации пользователей до обработки ошибок.
Ничто не идеально
Rails имеет свои недостатки. Ruby работает медленнее, чем большинство других языков. Это, вероятно, изменится с выходом новых версий, но на данный момент этот недостаток критичен для тех приложений, которым важно время обработки. В действительности, это не проблема для большинства веб-сайтов.
Также есть проблема с размещением Rails-приложений. Из-за размера кода фреймворка Rails, он должен храниться в памяти все время и загружен в ответ на запрос. Вам необходимо 100-200 Мб встроенной памяти для размещения приложений даже с низким трафиком. Для сравнения, приложения на PHP вы можете разместить сколь угодно, потому что они не занимают память, когда недоступны.
Из-за этих требований к серверу, найти виртуальный хостинг для Rails-приложений, как правило, весьма проблематично. VPS (Virtual Private Server) – самый лучший выбор. Настройка сервера сложнее, чем для PHP. Но сейчас есть много Rails-ориентированных хостинг-компаний, которые предоставляют готовые решения.
Другим результатом этих требования к серверу является то, что хостинг для Rails, как правило, дороже, чем для других платформ и языков.
Обучение
Изучение Rails может быть трудным для новичка и потребует несколько месяцев, чтобы разобраться в синтаксисе и ООП. Но уже с начала обучения вы сможете создать простой сайт. В процессе работы над ним вы получите новые навыки и знания, которые вам нужны.
Заключение
Как только вы изучите Ruby on Rails, он станет вам верным другом. С помощью этого мощного набора инструментов в ваших руках вы будете работать более продуктивно, чем когда-либо.
Будучи в состоянии сделать больше с меньшими затратами, вы будете создавать лучшие проекты и получать больше удовольствия от процесса. Приятного обучения!
Написать приложение ruby on rails
С чего начать?
Модели
Контроллеры
Другие компоненты
Копаем глубже
Копаем глубже
Расширяем Rails
Вносим вклад в Ruby on Rails
Заметки о релизах
Принимаем пожелания и пул-реквесты!
1. Допущения в этом руководстве
2. Что такое Rails?
3. Создание нового проекта Rails
3.1. Установка Rails
3.1.1. Установка Ruby
3.1.2. Установка SQLite3
3.1.3. Установка Node.js и Yarn
3.1.4. Установка Rails
3.2. Создание приложения Blog
4. Hello, Rails!
4.1. Запуск веб-сервера
4.2. Скажите «привет», Рельсы
4.3. Настройка домашней страницы приложения
5. Вы и MVC
5.1. Генерация модели
5.2. Миграции базы данных
5.3. Использование модели для взаимодействия с базой данных
5.4. Отображение списка статей
6. Используйте CRUD там, где нужно использовать CRUD
6.1. Отображение отдельной статьи
6.2. Ресурсный роутинг
6.3. Создание новой статьи
6.3.1. Использование построителя форм
6.3.2. Использование Strong Parameters
6.3.3. Валидации и отображение сообщений об ошибке
6.3.4. Завершаем начатое
6.4. Обновление статьи
6.5. Использование партиалов для совместного использования кода вью
6.5.1. Завершаем начатое
6.6. Удаление статьи
7. Добавляем вторую модель
7.1. Генерируем модель
7.2. Связываем модели
7.3. Добавляем маршрут для комментариев
7.4. Генерируем контроллер
8. Рефакторинг
8.1. Рендеринг коллекций партиалов
8.2. Рендеринг формы в партиале
8.3. Использование Concerns
9. Удаление комментариев
9.1. Удаление связанных объектов
10. Безопасность
10.1. Базовая аутентификация
10.2. Прочие мысли о безопасности
11. Что дальше?
12. Ошибки конфигурации
Rails для начинающих
Это руководство раскрывает установку и запуск Ruby on Rails.
После его прочтения, вы узнаете:
1. Допущения в этом руководстве
Это руководство рассчитано на новичков, которые хотят создать приложение на Rails с нуля. Оно не предполагает, что вы раньше работали с Rails.
Rails – фреймворк для веб-разработки, написанный на языке программирования Ruby. Если у вас нет опыта в Ruby, возможно вам будет тяжело сразу приступить к изучению Rails. Есть несколько хороших англоязычных ресурсов, посвященных изучению Ruby, например:
Обращайте внимание, что некоторые источники, хотя все еще великолепные, но все же покрывают старые версии Ruby, и могут не включать некоторые элементы синтаксиса, которые вы увидите в повседневной разработке на Rails.
2. Что такое Rails?
Философия Rails включает два важных ведущих принципа:
3. Создание нового проекта Rails
3.1. Установка Rails
Перед установкой Rails необходимо проверить, чтобы в вашей системе были установлены необходимые предварительные зависимости. К ним относятся:
3.1.1. Установка Ruby
Rails требует, чтобы был установлен Ruby версии 2.7.0 или новее. Предпочтительно использовать последнюю версию Ruby. Если номер версии меньше этой (такие как 2.3.7 или 1.8.7), нужно будет установить новую копию Ruby.
Чтобы установить Ruby на Windows, сначала нужно установить Ruby Installer.
Дополнительные методы установки для большинства операционных систем можно увидеть на ruby-lang.org.
3.1.2. Установка SQLite3
Вам также понадобится установка базы данных SQLite3.
Многие популярные UNIX-подобные ОС поставляются с приемлемой версией SQLite3. Прочие пользователи могут обратиться к инструкциям по установке на сайте SQLite3.
Проверьте, что он правильно установлен и содержится в вашем PATH загрузки:
Программа должна сообщить свою версию.
3.1.3. Установка Node.js и Yarn
Наконец, необходимы установленные Node.js и Yarn для управления JavaScript приложения.
Найдите инструкции по установке на веб-сайте Node.js и убедитесь, что он установлен корректно, с помощью следующей команды:
Должна быть выведена версия вашего Node.js runtime. Убедитесь, что она выше, чем 8.16.0.
Чтобы установить Yarn, следуйте инструкции по установке на веб-сайте Yarn.
Запуск следующей команды должен вывести версию Yarn:
Если она сообщает что-то вроде «1.22.0», Yarn был установлен корректно.
3.1.4. Установка Rails
Чтобы проверить, что все установлено верно, нужно выполнить следующее в новом терминале:
Если выводится что-то вроде «Rails 7.0.0», можно продолжать.
3.2. Создание приложения Blog
Rails поставляется с рядом скриптов, названных генераторами, разработанных для облегчения жизни разработчика, создавая все, что необходимо для начала работы над определенной задачей. Одним из них является генератор нового приложения, предоставляющий вам основу приложения Rails, таким образом, вам не нужно писать его самим.
Для использования этого генератора, откройте терминал, войдите в папку, в которой у вас есть права на создание файлов и запустите:
После того, как вы создали приложение blog, перейдите в его папку:
4. Hello, Rails!
Для начала, давайте выведем на экран какой-либо текст. Для этого нужен запущенный сервер вашего приложения на Rails.
4.1. Запуск веб-сервера
Фактически у вас уже есть функциональное приложение на Rails. Чтобы убедиться, нужно запустить веб-сервер на вашей машине. Это можно осуществить, запустив следующую команду из директории blog :
Это запустит Puma, веб-сервер, распространяющийся с Rails по умолчанию. Чтобы увидеть приложение в действии, откройте окно браузера и пройдите по адресу http://localhost:3000. Вы должны увидеть дефолтную информационную страницу Rails:
Когда захотите остановить веб-сервер, нажмите Ctrl+C в терминале, где он запущен. В среде development, Rails в основном не требует остановки сервера; все изменения, которые Вы делаете в файлах, автоматически подхватываются сервером.
Страница «Yay! You’re on Rails!» это smoke test для нового приложения на Rails: она показывает, что ваши программы настроены достаточно правильно для отображения страницы.
4.2. Скажите «привет», Рельсы
Чтобы Rails сказал «Привет», нужно создать, как минимум, маршрут, контроллер с экшном и вью (представление). Маршрут связывает запрос с экшном контроллера. Экшн контроллера выполняет необходимую работу для обработки запроса и подготавливает необходимые данные для вью. Вью отображает данные в желаемом формате.
В терминах реализации: Маршруты это правила, написанные на Ruby DSL (предметно-ориентированном языке). Контроллеры — это классы Ruby, и их публичные методы — это экшны. И вью — это шаблоны, обычно написанные на смеси HTML и Ruby.
Rails создаст несколько файлов.
Давайте откроем файл app/views/articles/index.html.erb и заменим его содержимое на:
4.3. Настройка домашней страницы приложения
В настоящий момент http://localhost:3000 все еще отображает «Yay! You’re on Rails!». Давайте также отобразим наш текст «Hello, Rails!» на http://localhost:3000. Для этого мы добавим маршрут, соответствующий корневому пути нашего приложения к соответствующему контроллеру и экшну.
Откройте config/routes.rb и добавьте следующий маршрут root вверху блока Rails.application.routes.draw :
Чтобы узнать больше о роутинге, обратитесь к руководству Роутинг в Rails.
5. Вы и MVC
Только что мы обсудили маршруты, контроллеры, экшны и вью. Это все типичные части веб приложения, соответствующего паттерну MVC (Model-View-Controller). MVC это шаблон проектирования, разделяющий ответственности приложения для его упрощения. Rails по соглашению следует этому шаблону проектирования.
Поскольку у нас уже есть контроллер и вью, давайте сгенерируем следующую часть: модель.
5.1. Генерация модели
Модель это класс Ruby, используемый для представления данных. Кроме этого, модели могут взаимодействовать с базой данных приложения с помощью особенности Rails, называемой Active Record.
Для определения модели используем генератор модели:
Это создаст несколько файлов:
Два файла, на которых мы сфокусируемся, это файл миграции ( db/migrate/ _create_articles.rb ) и файл модели ( app/models/article.rb ).
5.2. Миграции базы данных
Миграции используются для изменения структуры базы данных приложения. В приложениях Rails миграции написаны на Ruby, поэтому они могут быть не зависящими от базы данных.
Давайте посмотрим на содержимое нового файла миграции:
Давайте запустим нашу миграцию с помощью следующей команды:
Эта команда выведет, что таблица была создана:
Чтобы узнать больше о миграциях, смотрите Миграции Active Record.
Теперь мы можем взаимодействовать с этой таблицей с помощью нашей модели.
5.3. Использование модели для взаимодействия с базой данных
Давайте запустим консоль с помощью команды:
Вы должны увидеть интерфейс irb наподобие:
В этом интерфейсе можно инициализировать новый объект Article :
Важно отметить, что мы только инициализировали этот объект. Этот объект вообще не сохранен в базе данных. В настоящий момент он доступен только в консоли. Чтобы сохранить его в базу данных, нужно вызвать save :
Когда мы хотим извлечь эту статью из базы данных, можно вызвать find на модели и передать id в качестве аргумента:
И когда мы хотим извлечь все статьи из базы данных, можно вызвать all на модели:
Модели это последний кусочек пазла MVC. Далее мы соединим все кусочки вместе.
5.4. Отображение списка статей
Окончательный результат можно увидеть, посетив http://localhost:3000. (Помните, что bin/rails server должен быть запущен!) Вот что произойдет при этом:
Мы соединили все кусочки MVC вместе, и теперь у нас есть наш первый экшн контроллера! Далее мы двинемся ко второму экшну.
6. Используйте CRUD там, где нужно использовать CRUD
Почти все веб приложения используют операции CRUD (Create, Read, Update, and Delete). Можно обнаружить, что большая часть работы вашего приложения это CRUD. Rails знает об этом и предоставляет много особенностей для упрощения кода, осуществляющего CRUD.
Давайте исследуем эти возможности, добавив больше функционала в наше приложение.
6.1. Отображение отдельной статьи
Сейчас у нас есть вью, отображающая все статьи в нашей базе данных. Давайте добавим новую вью, показывающую заголовок и содержимое отдельной статьи.
Начнем с добавления нового маршрута, направляющего на новый экшн контроллера (который затем тоже добавим). Откройте config/routes.rb и вставьте последний маршрут, показанный тут:
Давайте создадим app/views/articles/show.html.erb со следующим содержимым:
Теперь можно увидеть статью при посещении http://localhost:3000/articles/1!
В завершении, давайте добавим удобный способ перейти на страницу статьи. Мы свяжем заголовок каждой статьи в app/views/articles/index.html.erb с ее страницей:
6.2. Ресурсный роутинг
К этому моменты мы раскрыли «R» (Read) из CRUD. Со временем мы раскроем «C» (Create), «U» (Update) и «D» (Delete). Как вы, возможно, догадались, мы сделаем это, добавив новые маршруты, экшны контроллера и вью. Всякий раз, когда у нас есть такая комбинация маршрутов, экшнов контроллера и вью, работающих вместе для выполнения операций CRUD на сущности, мы называем эту сущность ресурсом. Например, в нашем приложении, мы бы назвали статью ресурсом.
Можно посмотреть, какие маршруты связаны, запустив команду bin/rails routes :
Метод resources также настраивает вспомогательные методы URL и путей, которые можно использовать для предотвращения зависимостей нашего кода от настроек определенного маршрута. Значения выше в столбце «Prefix» плюс суффикс _url или _path формируют имена этих хелперов. Например, хелпер article_path возвращает «/articles/#
Подробнее о роутинге смотрите Роутинг в Rails.
6.3. Создание новой статьи
Теперь мы подходим к «C» (Create) из CRUD. Обычно, в веб приложениях, создание нового ресурса это многошаговый процесс. Сначала пользователь запрашивает форму для заполнения. Затем пользователь отправляет форму. Если нет ошибок, то ресурс создается, и отображается некоторое подтверждение. Иначе, форма снова отображается с сообщениями об ошибке, и процесс повторяется.
redirect_to приведет к тому, что браузер сделает новый запрос, в то время как render отрендерит указанную вью для текущего запроса. Важно использовать redirect_to после изменения базы данных или состояния приложения. В противном случае, если пользователь обновит страницу, браузер осуществит тот же самый запрос, и изменение будет повторено.
6.3.1. Использование построителя форм
Мы будем использовать особенность Rails, называемую form builder, для создания нашей формы. Используя построитель форм, можно, используя минимальное количество кода, вывести полностью настроенную форму, следующую соглашениям Rails.
Давайте создадим app/views/articles/new.html.erb со следующим содержимым:
Вспомогательный метод form_with инициализирует построитель форм. В блоке form_with мы вызываем на построителе форм методы, такие как label и text_field для вывода подходящих элементов формы.
Результирующий вывод от вызова form_with будет выглядеть так:
Чтобы подробнее узнать о построителях форм, смотрите Хелперы форм в Action View.
6.3.2. Использование Strong Parameters
Чтобы подробнее узнать о Strong Parameters, смотрите Обзор Action Controller § Strong Parameters.
6.3.3. Валидации и отображение сообщений об ошибке
Как мы видели, создание ресурса это многоступенчатый процесс. Обработка неправильного пользовательского ввода это еще один шаг этого процесса. Rails предоставляет особенность валидации, чтобы помочь нам разобраться с неправильным пользовательским вводом. Валидации это правила, проверяемые до сохранения объекта модели. Если любая из проверок провалится, сохранение будет прервано, и соответствующие сообщения об ошибке будут добавлены в атрибут errors у объекта модели.
Давайте добавим некоторые валидации в нашу модель в app/models/article.rb :
Вторая валидация объявляет, что значение body также должно присутствовать. Кроме этого, она объявляет, что длина значения body должно быть как минимум 10 символов.
С имеющимися валидациями, давайте изменим app/views/articles/new.html.erb для отображения любых сообщений об ошибке для title и body :
Метод full_messages_for возвращает массив дружелюбных сообщений об ошибке для определенного атрибута. Если для атрибута нет ошибок, этот массив будет пустым.
Чтобы понять, как это все работает, давайте снова взглянем на экшны new и create контроллера:
Чтобы больше узнать о валидациях, обратитесь к Валидации Active Record. Чтобы больше узнать о сообщениях об ошибке валидации, обратитесь к Валидации Active Record § Working with Validation Errors.
6.3.4. Завершаем начатое
Теперь мы можем создать статью, посетив http://localhost:3000/articles/new. Для завершения давайте добавим ссылку на эту страницу внизу app/views/articles/index.html.erb :
6.4. Обновление статьи
Мы покрыли «CR» от CRUD. Теперь перейдем к «U» (Update). Обновление ресурса очень похоже на создание ресурса. Они оба многоступенчатые процессы. Во-первых, пользователь запрашивает форму для редактирования данных. Затем пользователь отправляет форму. Затем, если не было ошибок, ресурс обновляется. В противном случае, форма снова отображается с сообщениями об ошибке, и процесс повторяется.
6.5. Использование партиалов для совместного использования кода вью
Так как код будет тем же самым, мы собираемся рефакторить его в совместную вью, называемую партиал. Давайте создадим app/views/articles/_form.html.erb со следующим содержимым:
И теперь давайте создадим очень похожий app/views/articles/edit.html.erb :
6.5.1. Завершаем начатое
Теперь мы можем обновлять статью, посетив страницу ее редактирования, т.е. http://localhost:3000/articles/1/edit. Для завершения, давайте добавим ссылку на страницу редактирования внизу app/views/articles/show.html.erb :
6.6. Удаление статьи
Итак, давайте добавим типичный экшн destroy в app/controllers/articles_controller.rb ниже экшна update :
Экшн destroy извлекает статью из базы данных, и вызывает destroy на ней. Затем он перенаправляет браузер на корневой путь.
Чтобы узнать подробнее про ненавязчивый JavaScript, смотрите Работа с JavaScript в Rails.
Вот и все! Теперь можно просматривать, создавать, обновлять и удалять статьи!
7. Добавляем вторую модель
Настало время добавить вторую модель в приложение. Вторая модель будет обрабатывать комментарии к статьям.
7.1. Генерируем модель
Эта команда генерирует четыре файла:
Файл | Назначение |
---|---|
db/migrate/20140120201010_create_comments.rb | Миграция для создания таблицы comments в вашей базе данных (ваше имя файла будет включать другую временную метку) |
app/models/comment.rb | Модель Comment |
test/models/comment_test.rb | Каркас для тестирования модели комментария |
test/fixtures/comments.yml | Образцы комментариев для использования в тестировании |
Сначала взглянем на app/models/comment.rb :
В дополнение к модели, Rails также сделал миграцию для создания соответствующей таблицы базы данных:
Rails достаточно сообразителен, чтобы выполнять только те миграции, которые еще не были запущены для текущей базы данных, в нашем случае Вы увидите:
7.2. Связываем модели
Связи Active Record позволяют Вам легко объявлять отношения между двумя моделями. В случае с комментариями и статьями, вы можете описать отношения следующим образом:
Фактически, это очень близко к синтаксису, который использует Rails для объявления этой связи. Вы уже видели строчку кода в модели Comment (app/models/comment.rb), которая делает каждый комментарий принадлежащим статье:
Более подробно о связях Active Record смотрите руководство Связи (ассоциации) Active Record.
7.3. Добавляем маршрут для комментариев
Более подробно о роутинге написано в руководстве Роутинг в Rails.
7.4. Генерируем контроллер
Имея модель, обратим свое внимание на создание соответствующего контроллера. Снова будем использовать тот же генератор, что использовали прежде:
Создадутся четыре файла и пустая директория:
Файл/Директория | Назначение |
---|---|
app/controllers/comments_controller.rb | Контроллер Comments |
app/views/comments/ | Вью контроллера хранятся здесь |
test/controllers/comments_controller_test.rb | Тест для контроллера |
app/helpers/comments_helper.rb | Хелпер для вью |
app/assets/stylesheets/comments.scss | Каскадная таблица стилей для контроллера |
Как и в любом другом блоге, наши читатели будут создавать свои комментарии сразу после прочтения статьи, и после добавления комментария они будут направляться обратно на страницу отображения статьи и видеть, что их комментарий уже отражен. В связи с этим, наш CommentsController служит в качестве средства создания комментариев и удаления спама, если такой будет.
Сначала мы расширим шаблон Article show ( app/views/articles/show.html.erb ), чтобы он позволял добавить новый комментарий:
Давайте напишем create в app/controllers/comments_controller.rb :
Теперь в вашем блоге можно добавлять статьи и комментарии и отображать их в нужных местах.
8. Рефакторинг
8.1. Рендеринг коллекций партиалов
Сначала сделаем партиал для комментариев, показывающий все комментарии для статьи. Создайте файл app/views/comments/_comment.html.erb и поместите в него следующее:
Затем можно изменить app/views/articles/show.html.erb вот так:
8.2. Рендеринг формы в партиале
Затем измените app/views/articles/show.html.erb следующим образом:
Объект @article доступен в любых партиалах, рендерящихся во вью, так как мы определили его как переменную экземпляра.
8.3. Использование Concerns
Concerns — это способ упростить большие контроллеры или модели для лучшего понимания и управления. У этого также есть преимущество повторного использования, когда несколько моделей (или контроллеров) разделяют те же самые concerns. Concerns реализуются с помощью модулей, содержащих методы, представляющие четко очерченный срез функциональности, за которую ответственны модель или контроллер. В других языках модули часто называются миксинами (mixin).
и в модель Comment :
Также можно добавить наши валидации статуса в concern, но это немного сложнее, так как валидации — это методы, вызванные на уровне класса. ActiveSupport::Concern (руководство по API) предоставляет нам более простой способ включить их:
Теперь можно убрать дублированную логику из каждой модели, а вместо нее включить наш новый модуль Visible :
и в app/models/comment.rb :
Методы класса также можно добавить в concern. Если нам нужно количество публичных статей или комментариев для отображения на главной странице, можно добавить метод класса в Visible следующим образом:
Затем во вью его можно вызвать как любой другой метод класса:
Чтобы узнать больше о миграциях, смотрите Миграции Active Record.
и в app/controllers/comments_controller.rb :
и в app/views/comments/_form.html.erb :
9. Удаление комментариев
Поэтому сначала добавим ссылку для удаления в партиал app/views/comments/_comment.html.erb :
Экшн destroy найдет статью, которую мы просматриваем, обнаружит комментарий в коллекции @article.comments и затем уберет его из базы данных и вернет нас обратно на просмотр статьи.
9.1. Удаление связанных объектов
10. Безопасность
10.1. Базовая аутентификация
Если вы опубликуете свой блог онлайн, любой сможет добавлять, редактировать и удалять статьи или удалять комментарии.
Rails предоставляет аутентификационную систему HTTP, которая хорошо работает в этой ситуации.
Мы также хотим позволить только аутентифицированным пользователям удалять комментарии, поэтому в CommentsController ( app/controllers/comments_controller.rb ) мы напишем:
Теперь, если попытаетесь создать новую статью, то встретитесь с вызовом базовой аутентификации HTTP:
Также для приложений на Rails доступны иные методы аутентификации. Двумя популярными дополнениями для Rails, среди прочих, являются Devise и Authlogic.
10.2. Прочие мысли о безопасности
Безопасность, особенно в веб-приложениях, это обширная и детализированная область. Безопасность вашего приложения Rails раскрывается более детально в руководстве Безопасность приложений на Rails.
11. Что дальше?
После того, как вы создали свое первое приложение на Rails, можете свободно его модифицировать и экспериментировать на свое усмотрение.
Помните, что вы не сможете сделать без посторонней помощи все, что угодно. Так же, как вы обращались к этому руководству «Rails для начинающих», далее можете так же свободно пользоваться этими ресурсами:
12. Ошибки конфигурации
Простейший способ работы с Rails заключается в хранении всех внешних данных в UTF-8. Если не так, библиотеки Ruby и Rails часто будут способны конвертировать ваши родные данные в UTF-8, но это не всегда надежно работает, поэтому лучше быть уверенным, что все внешние данные являются UTF-8.
Если вы допускаете ошибку в этой области, наиболее обычным симптомом является черный ромбик со знаком вопроса внутри, появляющийся в браузере. Другим обычным симптомом являются символы, такие как «Ã¼» появляющиеся вместо «ü». Rails предпринимает ряд внутренних шагов для смягчения общих случаев тех проблем, которые могут быть автоматически обнаружены и исправлены. Однако, если имеются внешние данные, не хранящиеся в UTF-8, это может привести к такого рода проблемам, которые не могут быть автоматически обнаружены Rails и исправлены.
Два наиболее обычных источника данных, которые не в UTF-8: