Вы находитесь на странице: 1из 33

1.

Установка Ruby on Rails

1. Запустите установочный файл railsinstaller-3.1.0.exe.

2. В процессе установки оставляйте все положения по умолчанию, за исключением директории установки. Дополните ее своей фамилией.

. Дополните ее своей фамилией. 3. Оставьте галочку на опции

3. Оставьте галочку на опции «Сконфигурировать git и ssh после окончания инсталяции»

ssh после окончания инсталяции» 4. После этого откроется

4. После этого откроется терминальное окно, в котором вы должны будете внести свое имя и адрес электронной почты, после чего будет сгенерирован ключ для ssh. Запомните адрес файла с ключом.

2. Что такое Rails?

Rails – фреймворк для веб-разработки, написанный на языке программирования Ruby. Он разработан, чтобы сделать программирование веб-приложений проще, так как использует ряд допущений о том, что нужно каждому разработчику для создания нового проекта. Он позволяет вам писать меньше кода в процессе программирования, в сравнении с другими языками и

фреймворками. Профессиональные разработчики на Rails также отмечают, что с ним разработка веб-приложений более забавна.

Rails – своевольный программный продукт. Он делает предположение, что имеется "лучший" способ что-то сделать, и он так разработан, что стимулирует этот способ – а в некоторых случаях даже препятствует альтернативам. Если изучите "The Rails Way", то, возможно, откроете в себе значительное увеличение производительности. Если будете упорствовать и переносить старые привычки с других языков в разработку на Rails, и попытаетесь использовать шаблоны, изученные где-то еще, ваш опыт разработки будет менее счастливым.

3. Проверка компонентов Ruby on Rails?

Для того, чтобы убедиться, что у нас установлен правильный набор разработки под Ruby on Rails в командной строке напишите следующие команды:

1. ruby v Это запрос версии Ruby. Она должна быть 2.1.5

2. sqlite3

--version Это запрос на версии базы данных SQLite. Она должна быть

3.8.7.2.

3. Теперь необходимо проверить, правильно ли мы установили сам фреймворк Rails. Для этого воспользуйтесь командой rails --version. Если покажет что-то вроде “Rails

4.1.8”, то можно продолжать работать.

4. Создание первого приложения Blog

Rails поставляется с рядом скриптов, названных генераторами, разработанных для облегчения жизни разработчика, создавая все, что необходимо для начала работы над определенной задачей. Одним из них является генератор нового приложения, предоставляющий вам основу приложения Rails, таким образом, вам не нужно писать его самим.

1. Для использования этого генератора, откройте терминал, войдите в папку, в которой у вас есть права на создание файлов и напишите:

rails new blog

Это создаст приложение на Rails с именем Blog в директории blog и установит гемы, зависимости от которых упомянуты в Gemfile при использовании bundle install.

2. После того, как вы создали приложение blog, перейдите в его папку:

cd blog

В директории blog имеется несколько автоматически созданных файлов и папок, задающих структуру приложения на Rails. Большая часть работы в этом самоучителе будет происходить в папке app, но сейчас пробежимся по функциям каждой папки, которые создает Rails в новом приложении по умолчанию:

Файл/Папка

Назначение

app/

Содержит контроллеры, модели, вьюхи, хелперы, рассыльщики и ресурсы вашего приложения.

bin/

Содержит Rails скрипты которые стартуют ваше приложение, также

 

директория может содержать другие скрипты которые вы используете для настройки, деплоя или запуска.

config/

Конфигурации маршрутов, базы данных вашего приложения, и т.д.

config.ru

Конфигурация Rack для серверов, основанных на Rack, используемых для запуска приложения.

db/

Содержит текущую схему вашей базы данных, а также миграции базы данных.

Gemfile

Эти файлы позволяют указать, какие зависимости от гемов нужны для вашего приложения на Rails. Эти файлы используются гемом Bundler.

Gemfile.lock

lib/

Внешние модули для вашего приложения.

log/

Файлы логов приложения.

public/

Единственная папка, которая доступна извне как есть. Содержит статичные файлы и скомпилированные ресурсы.

Rakefile

Этот файл содержит набор команд, которые могут быть запущены в командной строке. Определения команд производятся во всех компонентах Rails. Вместо изменения Rakefile, вы можете добавить свои собственные задачи, добавив файлы в директорию lib/tasks вашего приложения.

README.rdoc

Это вводный мануал для вашего приложения. Его следует отредактировать, чтобы рассказать остальным, что ваше приложение делает, как его настроить, и т.п.

test/

Юнит-тесты, фикстуры и прочий аппарат тестирования.

tmp/

Временные файлы (такие как файлы кэша и pid)

vendor/

Место для кода внешних разработчиков. В типичном приложении на Rails, включает внешние гемы.

5. Hello, Rails!

Для начала, давайте выведем на экран какой-либо текст. Для этого нужен запущенный сервер вашего приложения на Rails.

Фактически у вас уже есть функциональное приложение на Rails. Чтобы убедиться, нужно запустить веб-сервер на вашей машине. Это можно осуществить, запустив следующую команду из директории blog:

rails server

Это запустит WEBrick, веб-сервер, распространяющийся с Ruby по умолчанию. Чтобы увидеть приложение в действии, откройте окно браузера и пройдите по адресу http://localhost:3000. Вы должны увидеть дефолтную информационную страницу Rails.

Страница "Welcome Aboard" это своеобразный тест для нового приложения на Rails: она показывает, что ваши программы настроены достаточно правильно для отображения страницы. Также можете нажать по ссылке About your application’s environment чтобы увидеть сводку о среде вашего приложения.

Для остановки сервера нажмите Ctrl+C.

Чтобы Rails сказал "Привет", нужно создать, как минимум,

Чтобы Rails сказал "Привет", нужно создать, как минимум, контроллер и «вьюху».

Назначением контроллера является получение определенных запросов к приложению. Роутинг решает, какой контроллер получит какие запросы. Часто имеется более одного маршрута к каждому контроллеру, и различные маршруты могут быть обработаны различными экшнами. Назначением каждого экшна является сбор информации для предоставления ее во вьюху.

Назначением вьюхи (представления) является отображение этой информации в удобочитаемом формате. Необходимо отметить важное различие, что местом, в котором собирается информация, является контроллер, а не вьюха. Вьюха должна только лишь отображать эту информацию. По умолчанию шаблоны вьюх пишутся на языке, названном eRuby (Embedded Ruby), который конвертируется циклом запросов в Rails до отправки пользователю.

Для создания нового контроллера, нужно запустить генератор "controller" и сказать ему, что вы хотите контроллер с именем "welcome" с экшном по имени "index", вот так:

rails generate controller welcome index

Rails создаст несколько файлов и маршрут.

Наиболее важными из них являются, разумеется, контроллер, расположенный в app/controllers/welcome_controller.rb, и вьюха, расположенная в app/views/welcome/index.html.erb.

Откройте файл app/views/welcome/index.html.erb в текстовом редакторе. Удалите весь существующий в файле код и замените его на следующую единственную строчку кода:

Теперь, когда мы сделали контроллер и вьюху, нужно сказать Rails , что

Теперь, когда мы сделали контроллер и вьюху, нужно сказать Rails, что мы хотим увидеть "Hello Rails!". В нашем случае мы хотим это увидеть, когда зайдем в корневой URL нашего сайта, http://localhost:3000. Однако сейчас это место заняла тестовая страница "Welcome Aboard".

6. Настройка домашней страницы приложения

Чтобы это исправить, удалите файл index.html, расположенный в директории public приложения, если таковой имеется.

Так нужно сделать, так как Rails отдаст любой статичный файл из директории public, соответствующий маршруту, предпочтя его любому динамическому содержимому, создаваемому из контроллеров.

Файл index.html особенный: он будет отдан, если запрос придет в корневой маршрут, т.е. http://localhost:3000. Если произойдет другой запрос, такой как http://localhost:3000/welcome, будет отдан файл public/welcome.html, но только если он существует.

Теперь нужно сказать Rails, где находится настоящая домашняя страница.

Откройте файл config/routes.rb в редакторе.

Это маршрутный файл вашего приложения, который содержит варианты входа на сайт на специальном языке DSL (domain-specific language, предметно-ориентированный язык программирования), который говорит Rails, как соединять входящие запросы с контроллерами и экшнами. Этот файл содержит много закомментированных строк с примерами, и один из них фактически показывает, как соединить корень сайта с определенным контроллером и экшном. Найдите строку, начинающуюся с root и раскомментируйте ее. Должно получится следующее:

с root и раскомментируйте ее. Должно получится следующее:

root

контроллера welcome, а get

http://localhost:3000/welcome/index в экшн index контроллера welcome. Он был создан ранее при запуске генератора контроллера (bin/rails generate controller welcome index).

'welcome#index' говорит Rails направить запросы к корню приложения в экшн index

'welcome/index' говорит Rails направлять запросы к

Запустите снова веб-сервер, если вы его остановили для генерации контроллера (bin/rails server) и пройдите по адресу http://localhost:3000 в браузере. Вы увидите надпись Hello, Rails!, которую поместили в app/views/welcome/index.html.erb, показывающую, что этот новый маршрут действительно ведет в экшн index в WelcomeController, и вьюха корректно рендерится.

Если у вас будет выводиться ошибка, откройте файл шаблона blog\app\views\layouts и удалите строки с пятой по седьмую включительно. Сохраните и обновите страницу приложения в браузере.

7. Добавление ресурса

Теперь в приложении Blog, мы создадим новый ресурс. Ресурс – это термин, обозначающий коллекцию схожих объектов, таких как статьи, люди или животные. Можно создавать, читать, обновлять и уничтожать элементы для ресурса, и эти операции называются операциями CRUD (create, read, update, destroy).

Rails представляет метод resources, который используется для объявления стандартного ресурса REST. Вам необходимо добавить ресурс article в config/routes.rb, как представлено ниже.

config/routes.rb , как представлено ниже. Если запустить bin/rake стандартных

Если запустить bin/rake

стандартных действий RESTful. Обратите внимание, что Rails знает о форме единственного числа

слова article и разумно использует это различие.

routes, можно увидеть, что он объявил все маршруты для

Далее мы добавим возможность создания новых статей и сможем

Далее мы добавим возможность создания новых статей и сможем просматривать их. Это буквы "C" и "R" из CRUD: create и read.

Сперва нам необходимо где-то создать новую статью. Наиболее подходящим местом будет /articles/new. С уже определенным маршрутом уже можно осуществлять запросы к /articles/new приложения. Перейдите на http://localhost:3000/articles/new и вы увидите ошибку маршрутизации.

Эта ошибка произошла, поскольку маршрут нуждается в определенном контроллере, чтобы обслужить запрос. Решение этой проблемы простое: нужно создать контроллер с именем ArticlesController. Это будет сделано запуском команды:

rails generate controller articles

Если открыть только что созданный app/controllers/articles_controller.rb, можно увидеть абсолютно пустой контроллер:

app/controllers/articles_controller.rb , можно увидеть абсолютно пустой контроллер:

Контроллер – это просто класс, унаследованный от ApplicationController. В этом классе вы должны определить методы, которые станут экшнами для этого контроллера. Эти экшны будут выполнять операции CRUD со статьями в вашей системе.

Если теперь обновить http://localhost:3000/articles/new, вы увидите новую ошибку.

, вы увидите новую ошибку . Эта ошибка показывает, что Rails не

Эта ошибка показывает, что Rails не может найти экшн new внутри ArticlesController, который был только что создан. Это так, поскольку контроллеры в Rails при создании пустые по умолчанию, если вы не указали желаемые экшны при процессе генерации.

Чтобы вручную определить экшн в контроллере, все что нужно – это определить в нем новый метод. Откройте app/controllers/articles_controller.rb и в классе ArticlesController определите метод new, чтобы контроллер стал выглядеть так:

контроллер стал выглядеть так: С методом new , определенным в

С методом new, определенным в ArticlesController, если обновите http://localhost:3000/articles/new, увидите другую ошибку:

, если обновите http://localhost:3000/articles/new , увидите другую ошибку:

Вы получили эту ошибку, поскольку Rails ожидает, что обычные экшны, такие как этот, имеют связанные с ними вьюхи для отображения их информации. Когда нет доступных вьюх, Rails вызовет исключение.

Давайте разберем, что означает каждая часть этой ошибки.

Первая часть указывает, какой шаблон отсутствует. В нашем случае, шаблон articles/new. Rails сперва ищет этот шаблон. Если не находит, он пытается загрузить шаблон с именем application/new. Он так ищет, поскольку ArticlesController унаследован от ApplicationController.

Следующая часть сообщения содержит хэш. Ключ :locale в этом хэше просто показывает, на каком языке должен быть получен шаблон. По умолчанию это английский шаблон - или "en". Следующий ключ :formats определяет формат шаблона для отдачи в отклик. Формат по умолчанию :html, таким образом, Rails ищет шаблон HTML. Последний ключ, :handlers, говорит нам, какие обработчики шаблона могут быть использованы для рендеринга нашего шаблона. :erb в основном используется для шаблонов HTML, :builder используется для шаблонов XML, и :coffee использует CoffeeScript для создания шаблонов JavaScript.

Заключительная часть этого сообщения говорит нам, где Rails искал шаблоны. Шаблоны в простом приложении Rails, таком как наше, содержатся в одном месте, но в более сложных приложениях, они могут находиться в разных местах.

Простейшим шаблоном, работающим в данном случае, будет расположенный в app/views/articles/new.html.erb. Расширение этого файла важно: первое расширение это формат шаблона, а второе расширение это обработчик, который будет использован. Rails пытается найти шаблон с именем articles/new в app/views приложения. Форматом для этого шаблона может быть только html, а обработчиком должен быть один из erb, builder или coffee. Поскольку мы хотим создать новую форму HTML, будем использовать язык ERB, разработанный, чтобы внедрять Ruby в HTML.

Следовательно, файл должен называться articles/new.html.erb и должен быть расположен в директории app/views приложения.

Создайте новый файл app/views/articles/new.html.erb и поместите в него:

и поместите в него: Теперь при обновлении

Теперь при обновлении http://localhost:3000/articles/new вы увидите, что у страницы появился заголовок. Теперь маршрут, контроллер, экшн и вьюха гармонично работают. Время создать форму для новой статьи.

8. Первая форма

Для создания формы в этом шаблоне, мы будем использовать form builder. Основной form builder для Rails представлен методом хелпера по имени form_for. Для использования этого метода добавьте код в app/views/articles/new.html.erb:

код в app/views/articles/new.html.erb : Если теперь обновить страницу,

Если теперь обновить страницу, вы увидите точно такую форму как в начале примера. Создание форм в Rails очень простое.

При вызове form_for, вы передали в него определяющий объект для этой формы. В нашем случае это символ :article. Это сообщает хелперу form_for, для чего эта форма. Внутри блока для этого метода, объект FormBuilder – представленный как f– используется для создания двух меток и двух текстовых полей, по одному для заголовка и текста статьи. Наконец, вызов submit на объекте f создаст кнопку отправки формы.

Хотя, у этой формы есть одна проблема. Если посмотрите на созданный HTML, просмотрев исходник страницы, то увидите у формы атрибут action, указывающий на /articles/new. Это проблема, поскольку этот маршрут ведет на ту же самую страницу, и этот маршрут должен использоваться только для отображения формы для новой статьи.

Форме нужно использовать иной URL, чтобы вести куда-то еще. Это можно быстро сделать с помощью опции :url для form_for. Обычно в Rails, экшн, используемый для подтверждения формы new, такой как эта, называется "create", поэтому форма должна указывать на этот экшн.

Отредактируйте строчку form_for в app/views/articles/new.html.erb следующим образом:

В этом примере в опцию :url передан хелпер articles_path . Чтобы увидеть,

В этом примере в опцию :url передан хелпер articles_path. Чтобы увидеть, что с помощью него делает Rails, снова посмотрим на результат rake routes. Остановите сервер и запустите команду rake routes:

и запустите команду rake routes : Хелпер articles_path сообщает Rails

Хелпер articles_path сообщает Rails указать форме на URI Pattern, связанный с префиксом articles; и форма пошлет (по умолчанию) запрос POST на этот маршрут. Он связан с экшном create текущего контроллера, ArticlesController.

С определенными формой и ее связанным маршрутом, можно заполнить форму и нажать на кнопку отправки, чтобы начать процесс создания новой статьи, сделайте это. При отправке формы вы увидите ошибку:

Чтобы это заработало, нужно создать экшн create в ArticlesController . 8.

Чтобы это заработало, нужно создать экшн create в ArticlesController.

8. Первая форма

Чтобы убрать "Unknown action", нужно определить экшн create в классе ArticlesController в app/controllers/articles_controller.rb, ниже экшна new, как показано:

, ниже экшна new, как показано: Если теперь еще раз отправить

Если теперь еще раз отправить форму, вы увидите другую знакомую ошибку: отсутствует шаблон. Это нормально, сейчас это можно проигнорировать. Экшн create должен только сохранять нашу статью в базу данных.

При отправке формы, ее поля будут посланы в Rails как параметры. К этим параметрам можно обратиться из экшнов контроллера, как правило, для выполнения определенных задач. Чтобы увидеть, на что похожи эти параметры, измените экшн create так:

Чтобы увидеть, на что похожи эти параметры, измените экшн create так:

Тут метод render принимает очень простой хэш с ключом :plain и значением params[:article].inspect. Метод params это объект, представляющий параметры (или поля), приходящие от формы. Метод params возвращает объект ActiveSupport::HashWithIndifferentAccess, позволяющий получать доступ к ключам хэша с использованием или строк, или символов. В этой ситуации имеют значение только параметры, пришедшие от формы.

Если еще раз отправить форму, вы больше не увидите ошибку об отсутствующем шаблоне. Вместо этого вы увидите что-то вроде следующего:

что - то вроде следующего: Теперь этот экшн отображает

Теперь этот экшн отображает параметры для статьи, пришедшие из формы. Однако, это все еще бесполезно. Вы видите параметры, но по сути ничего не делаете с ними.

9. Создание модели Article

Модели в Rails используют имя в единственном числе, а их соответствующая таблица в базе данных – имя во множественном числе. Rails предоставляет генератор для создания моделей, которым пользуются большинство разработчиков на Rails для создания новых моделей. Для создания новой модели, запустите эту команду в своем терминале:

rails generate model Article title:string text:text

С помощью этой команды мы сообщаем Rails что хотим модель Article с атрибутом title строкового типа и атрибутом text текстового типа. Эти атрибуты автоматически добавятся в таблицу articles и привяжутся к модели Article.

Rails в ответ создаст ряд файлов. Сейчас нам интересны только app/models/article.rb и db/migrate/20151104191729_create_articles.rb (у вас имя может немного отличаться). Последний ответственен за создание структуры базы данных, поэтому мы и рассмотрим его далее.

Active Record достаточно сообразителен, чтобы автоматически связать имена столбцов с атрибутами модели, что означает, что внутри моделей Rails не нужно объявлять атрибуты, Active Record сделает это автоматически.

10. Запуск миграции

Как вы уже видели, rails db/migrate.

generate

model создал файл миграции базы данных в директории

Миграции – это класс Ruby, разработанный для того, чтобы было просто создавать и модифицировать таблицы базы данных. Rails использует команды rake для запуска миграций, и возможна отмена миграции после того, как она была применена к вашей базе данных. Имя файла

миграции включает временную метку, чтобы быть уверенным, что они выполняются в той последовательности, в которой они создавались.

Если Вы заглянете в файл db/migrate/YYYYMMDDHHMMSS_create_articles.rb, вот что там обнаружите:

, вот что там обнаружите: Эта миграция создает метод change ,

Эта миграция создает метод change, вызываемый при запуске этой миграции. Действие, определенное в этой миграции, также является обратимым, что означает, что Rails знает, как отменить изменения, сделанные этой миграцией, в случае, если вы решите их отменить позже. Когда вы запустите эту миграцию, она создаст таблицу articles со строковым столбцом и текстовым столбцом. Она также создаст два поля временных меток для отслеживания времени создания и обновления статьи.

Сейчас нам нужно использовать команду rake, чтобы запустить миграцию:

rake db:migrate

Rails запустит эту команду миграции и сообщит, что он создал таблицу Articles.

что он создал таблицу Articles. 11. Сохранение данных в

11. Сохранение данных в контроллере

Возвратимся к ArticlesController, нам нужно изменить экшн create, чтобы использовать новую модель Article для сохранения данных в базе данных. Откройте app/controllers/articles_controller.rb и измените экшн create следующим образом:

Вот что тут происходит: каждая модель Rails может быть

Вот что тут происходит: каждая модель Rails может быть инициализирована с помощью соответствующих атрибутов, которые будут автоматически привязаны к соответствующим столбцам базы данных. В первой строчке мы как раз это и делаем (помните, что params[:article] содержит интересующие нас атрибуты). Затем @article.save ответственен за сохранение модели в базу данных. Наконец, мы перенаправляем пользователя на экшн show, который мы определим позже.

Если теперь перейти на http://localhost:3000/articles/new, вы почти сможете создать новую статью. Но получите ошибку, которая выглядит так:

ошибку, которая выглядит так: Rails имеет ряд защитных мер,

Rails имеет ряд защитных мер, помогающих писать безопасные приложения, и вы только что столкнулись с одной из них. Она называется strong parameters и требует, чтобы мы указали Rails, какие именно параметры разрешено передавать в экшны нашего контроллера.

Возможность взять и автоматически назначить все параметры контроллера в вашу модель облегчит работу программиста, но это удобство также позволяет использование в злонамеренных целях. Что, если запрос к серверу был специально создан как отправка формы новой статьи, но также включает дополнительные поля, которые нарушают целостность вашего приложения? Они будут 'массово назначены' в вашу модель и затем в базу данных среди нормальных данных — потенциально ломая ваше приложение, или еще хуже.

Нам нужно составить белый список параметров нашего контроллера, чтобы предотвратить ошибочное массовое назначение. В этом случае, мы хотим и разрешить, и затребовать параметры title и text для корректного использования в create. Синтаксис для этого представлен методами require и permit. Изменение затрагивает одну строчку в экшне create:

одну строчку в экшне create : Это часто выносится в отдельный

Это часто выносится в отдельный метод, чтобы его можно было повторно использовать в нескольких экшнах одного контроллера, например в create и update. Метод часто делают private, чтобы убедиться, что он не может быть вызван вне предназначенного контекста. Вот результат:

контекста. Вот результат: 12. Отображение статьи Если снова

12. Отображение статьи

Если снова отправить форму, Rails сообщит о ненайденном экшне show. Нам это уже не нужно, поэтому давайте добавим экшн show до того.

Как вы уже видели в результатах выполнения rake routes, маршрут для экшна show следующий:

Специальный синтаксис :id сообщит rails, что этот маршрут ожидает

Специальный синтаксис :id сообщит rails, что этот маршрут ожидает параметр :id, который в нашем случае будет идентификатором статьи.

Как и раньше, нам необходим экшн show в app/controllers/articles_controller.rb и его соответствующая вьюха.

С учетом этого, давайте добавим экшн show следующим образом:

экшн show следующим образом: Нужно отметить несколько вещей.

Нужно отметить несколько вещей. Мы использовали Article.find для поиска статьи, в которой мы заинтересованы, передав params[:id], чтобы получить параметр :id из запроса. Также мы использовали переменную экземпляра (с префиксом @) для хранения ссылки на объект статьи. Мы сделали так, потому что Rails передаст все переменные экземпляра во вьюху.

Теперь создайте новый файл app/views/articles/show.html.erb со следующим содержимым:

со следующим содержимым: С таким изменением, вы, наконец,

С таким изменением, вы, наконец, сможете создать новую статью. Посетите

Посетите http://localhost:3000/articles/new 13. Отображение всех статей Нам

13. Отображение всех статей

Нам все еще нужен способ для отображения списка всех наших статей, давайте сделаем его. Маршрут, выводящийся с помощью rake routes, следующий:

с помощью rake routes , следующий: Добавьте соответствующий этому

Добавьте соответствующий этому маршруту экшн index внутри ArticlesController в файле app/controllers/articles_controller.rb. Когда мы пишем экшн index, обычной практикой является разместить его как первый метод в контроллере:

И, наконец, вьюха для этого экшна, расположенная в

И, наконец, вьюха для этого экшна, расположенная в app/views/articles/index.html.erb:

вьюха для этого экшна, расположенная в app/views/articles/index.html.erb :

Теперь, если перейти в http://localhost:3000/articles, можно увидеть список всех статей, которые вы уже создали.

статей, которые вы уже создали. 14. Добавление ссылок Теперь вы

14. Добавление ссылок

Теперь вы можете создавать и просматривать отдельную и все статьи. Давайте добавим несколько ссылок для навигации между страницами.

Откройте app/views/welcome/index.html.erb и измените его следующим образом:

измените его следующим образом: Метод link_to – один из встроенных

Метод link_to – один из встроенных хелперов Rails. Он создает гиперссылку, на основе текста для отображения и указания куда перейти – в нашем случае путь для контроллера articles.

Давайте добавим ссылки и в другие вьюхи, начнем с добавления ссылки "Добавить статью" в app/views/articles/index.html.erb, поместив ее над тегом <table>:

статью" в app/views/articles/index.html.erb , поместив ее над тегом <table> :

Эта ссылка позволит перейти на форму для создания новой статьи.

Теперь добавьте еще одну ссылку в app/views/articles/new.html.erb, под формой, чтобы вернуться обратно в экшн index:

вернуться обратно в экшн index : Наконец, добавьте ссылку в

Наконец, добавьте ссылку в шаблон app/views/articles/show.html.erb, чтобы также вернуться в экшн index, чтобы просматривающие отдельную статью могли вернуться и просмотреть снова полный список:

просмотреть снова полный список: Обновите страницы, посмотрите,

Обновите страницы, посмотрите, что получилось.

15. Добавление валидации

Файл модели app/models/article.rb выглядит просто:

Заметьте, что класс Article наследован от ActiveRecord::Base . Active Record

Заметьте, что класс Article наследован от ActiveRecord::Base. Active Record обеспечивает огромную функциональность для Ваших моделей Rails, включая основные операции для базы данных CRUD (Create, Read, Update, Destroy - создать, читать, обновить, уничтожить), валидации данных, сложную поддержку поиска и возможность устанавливать отношения между разными моделями.

Rails включает методы, помогающие проверить данные, которые вы передаете в модель. Откройте файл app/models/article.rb и отредактируйте:

app/models/article.rb и отредактируйте: Эти изменения позволят быть

Эти изменения позволят быть уверенным, что все статьи имеют заголовок длиной как минимум пять символов. Rails может проверять разные условия в модели, включая существование или уникальность полей, их формат и существование связанных объектов.

Теперь, когда есть валидации, при вызове @article.save на невалидной статье, будет возвращен false. Если снова открыть app/controllers/articles_controller.rb, вы увидите, что мы не проверяем результат вызова @article.save в экшне create. Если в этой ситуации @article.save не удастся, нам нужно снова показать форму пользователю. Для этого замените экшны new и create вapp/controllers/articles_controller.rb на эти:

Теперь экшн new создает новую переменную экземпляра по имени @article

Теперь экшн new создает новую переменную экземпляра по имени @article.

В экшне create мы использовали render вместо redirect_to, когда save возвращает false. Метод render использован, чтобы объект @article был передан назад в шаблон new, когда он будет отрендерен. Этот рендеринг выполняется в рамках того же запроса, что и отправка формы, в то время как redirect_to сообщает браузеру выполнить другой запрос.

Если перезагрузите http://localhost:3000/articles/new и попытаетесь сохранить статью без заголовка, Rails вернет вас обратно на форму, но это не очень полезно. Вам нужно сказать пользователю, что что-то пошло не так. Для этого нужно модифицировать app/views/articles/new.html.erb для проверки на сообщения об ошибке:

Мы проверяем, имеются ли какие - либо ошибки с помощью @article.errors.any? ,

Мы проверяем, имеются ли какие-либо ошибки с помощью @article.errors.any?, и в этом случае показываем список всех ошибок с помощью @article.errors.full_messages.

pluralize это хелпер rails, принимающий число и строку как аргументы. Если число больше одного, строка будет автоматически склонено во множественном числе.

Причина, по которой мы добавили @article = Article.new в ArticlesController, в том, что в противном случае @article будет nil во вьюхе, и вызов @article.errors.any? вызовет ошибку.

Теперь у нас будет прекрасное сообщение об ошибке при сохранении статьи без заголовка, если попробуете так сделать в форме новой статьи http://localhost:3000/articles/new.

15. Обновление статей Мы раскрыли часть "CR" от CRUD. Теперь

15. Обновление статей

Мы раскрыли часть "CR" от CRUD. Теперь сфокусируемся на части "U", обновлении (updating) статей.

Первым шагом следует добавить экшн edit в ArticlesController, как правило между экшнами new и create, как показано.

Вьюха будет содержать форму, схожую с той, которую мы использовали

Вьюха будет содержать форму, схожую с той, которую мы использовали при создании новых статей. Создайте файл с именем app/views/articles/edit.html.erb и добавьте в него следующее:

Сейчас мы указываем форме на экшн update , который пока не определен,

Сейчас мы указываем форме на экшн update, который пока не определен, но скоро мы это сделаем.

Опция method: :patch говорит Rails, что мы хотим, чтобы эта форма была отправлена с помощью PATCH, метода HTTP, от которого ожидается, что он используется для обновления ресурсов в соответствии с протоколом REST.

Первым параметром form_for может быть объект, скажем, @article. который заставит хелпер заполнить форму полями объекта. Передав символ (:article) с тем же именем, как переменная экземпляра (@article), автоматически приведет к тому же поведению. Тут это и произошло.

Затем нужно создать экшн update в app/controllers/articles_controller.rb. Добавьте его между экшном create и методом private:

Новый метод, update , используется, когда хотите обновить запись,

Новый метод, update, используется, когда хотите обновить запись, которая уже существует, и он принимает хэш, содержащий атрибуты, которые вы хотите обновить. Как и прежде, если будет ошибка обновления статьи, мы хотим опять показать форму пользователю.

Мы заново использовали метод article_params, который определили ранее для экшна create.

Наконец, мы хотим показать ссылку на экшн edit в списке всех статей, так что, добавьте ее в app/views/articles/index.html.erb рядом с ссылкой "Перейти":

И также добавим в шаблон app/views/articles/show.html.erb , чтобы ссылка "

И также добавим в шаблон app/views/articles/show.html.erb, чтобы ссылка "Редактировать" также была на странице статьи. Добавьте следующее в конце шаблона:

следующее в конце шаблона: Запустите приложение. Вот как

Запустите приложение. Вот как оно должно выглядеть сейчас:

Попробуйте отредактировать уже имеющиеся статьи. 15.

Попробуйте отредактировать уже имеющиеся статьи.

15. Использование партиалов для очистки повторения во вьюхах

Наша страница edit очень похожа на страницу new, фактически они используют один и тот же код для отображения формы. Давайте уберем это дублирование, использовав партиал вьюхи. По соглашению, файлы партиалов начинаются со знака подчеркивания.

Создайте новый файл app/views/articles/_form.html.erb со следующим содержимым:

Создайте новый файл app/views/articles/_form.html.erb со следующим содержимым:

Все, за исключением объявления form_for, осталось тем же самым. Причина, по которой можно использовать это более короткое и простое объявление form_for по сравнению с другим формами, в том, что @article — это ресурс, соответствующий полному набору ресурсных маршрутов, и Rails способен определить, какой использовать URI и method.

Давайте сейчас обновим вьюху app/views/articles/new.html.erb, чтобы использовать этот новый партиал, переписав ее полностью:

партиал, переписав ее полностью: И то же самое для вьюхи

И то же самое для вьюхи app/views/articles/edit.html.erb:

для вьюхи app/views/articles/edit.html.erb : Теперь можете подобавлять и

Теперь можете подобавлять и отредактировать несколько статей. Визуально ничего не изменится, но количество кода, используемого приложением, значительно сократилось.

16. Удаление статей

Теперь мы готовы раскрыть часть "D" от CRUD, удаление (deleting) из базы данных. Следуя соглашению REST, маршрут для удаления статей в результатах вывода bin/rake routes следующий:

для удаления статей в результатах вывода bin/rake routes следующий:

Метод роутинга delete должен быть использован для маршрутов, уничтожающих ресурсы. Мы используем метод delete для уничтожения ресурсов, и этот маршрут связывается с экшном destroy в app/controllers/articles_controller.rb, который еще не существует. Метод destroy обычно последний экшн CRUD в контроллере, и подобно остальным публичным экшнам CRUD, он должен быть расположен перед любыми private или protected методами. Добавьте его:

protected методами. Добавьте его : Можно вызывать destroy на объектах

Можно вызывать destroy на объектах Active Record, когда вы хотите удалить их из базы данных. Вам не нужно добавлять вьюху для этого экшна, так как мы перенаправляем на экшн index.

Наконец, добавим ссылку 'Удалить' в шаблон экшна index (app/views/articles/index.html.erb), собрав все ссылки вместе.

Тут мы используем link_to другим образом. Мы передаем именованный

Тут мы используем link_to другим образом. Мы передаем именованный маршрут как второй аргумент, и опции как иной аргумент. Опции method: :delete и data: { confirm: 'Вы уверены?' } используются как атрибуты html5, поэтому при нажатии ссылки, Rails сначала покажет пользователю диалог подтверждения, а затем отправит ссылку с помощью метода delete. Это выполняется с помощью файла JavaScript jquery_ujs, который автоматически включается в макет приложения (app/views/layouts/application.html.erb) при создании приложения. Без этого файла диалог подтверждения не будет показан.

Запустите приложение и попробуйте удалить какую-нибудь из статей.