Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_по созданию ИС с помощью RoR_2018.docx
Скачиваний:
9
Добавлен:
17.06.2023
Размер:
12.5 Mб
Скачать

5 Работа с контроллерами

В предыдущем разделе, когда мы генерировали временные платформы (scaffold), в которых также создавались контроллеры, однако, когда наличие моделей или даже представлений не обязательно, то необходимо генерировать новые контроллеры отдельно. Процесс работы с контроллерами, мы рассмотрим на примере создания двух страниц с отчетами об увлеченности и популярности хобби сотрудников.

  1. Пишем в консоли команду для создания нового контроллера:

rails g controller Pop_hobby index search

Разберем команду. Заметьте, вместо слова generateпрописан более короткий вариант – просто g. Pop_hobby- это название контроллера, indexи searchэто методы внутри контроллера, причем названия их подобраны не спроста, поскольку indexи searchбудут в дальнейшем являться страницами.

Взгляните на созданный файл контроллера. Путь/app/controllers/pop_hobby_controller.rb (Рисунок5.1).

Рисунок 5.1 – Код контроллера pop_hobby

В коде видно как Railsавтоматически создал два метода для контроллера. Пока они пустые, однако, уже будут отлично работать для открытия страниц indexи search.

  1. Откройте файл представления /app/views/pop_hobby/index.html.erb

Это htmlстраничка, которая обрабатывает код Rails, об этом можно судить по формату после html “erb”. Сотрите код находящийся файле, он генерируется по умолчанию, и пропишем свой:

<h1>Отчет популярность хобби</h1>

<%= link_to 'Главная страница', controller: 'home_page' %>

<br><br>

<%= form_tag("search", method: "get") do %>

<%= label_tag(:q, "Поиск хобби:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("Искать") %>

<% end %>

<table border="1">

<th>Код</th>

<th>Хобби</th>

<th>Числоувлеченных</th>

<%= Hobby.find_each do |hobby| %>

<tr>

<td><%= hobby.id %></td>

<td><%= hobby.h_name %></td>

<td><%= HobbySotr.where(hobby_id: hobby.id).count %></td>

</tr>

<% end %>

Вкратце пройдемся по коду. Сразу отделим код Railsот html. Все, что лежит в тегах < … > (открывающий тег) и </ … > (закрывающий тег) - html. Все, что в <% … %>и <%= … %> - Rails. Разберем сначала html:

- <h1>. Это заголовок 1-ого размера. Весь текст, что будет лежать между тегами <h1>и </h1> будет выделен как заголовок;

- <br>переход на новую строчку;

- <tableborder=”1”>этотаблица, аborder=”1” – параметр, создающий рамку таблицы толщиной в 1 пиксель;

- <th> - это шапка таблицы;

- <tr>- новая строка таблицы;

- <td>- новый столбец.

Примечание:

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

Теперь рассмотрим код Rails:

<%= link_to 'Главная страница', controller: 'home_page' %> - этот код создает ссылку на контроллер home_page главной страницы, данный контроллер мы пока не создали, это мы проделаем позднее;

<%= form_tag("search", method: "get") do %>

<%= label_tag(:q, "Поиск хобби:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("Искать") %>

<% end %>

Этот код создаст форму для поиска, которая будет ссылаться на метод get. Label_tag это просто заголовок, text_field поле ввода, submit_tagкнопка. Подробнее о формах можно прочесть в документации по Ruby on Rails (url: http://rusrails.ru/) в разделе «Хелперы форм Action View»[1].

<%= Hobby.find_each do |hobby| %>

<tr>

<td><%= hobby.id %></td>

<td><%= hobby.h_name %></td>

<td><%= HobbySotr.where(hobby_id: hobby.id).count %></td>

</tr>

<% end %>

Этот код создает цикл по SQLзапросу за счет команды “Hobby.find_each” Railsпереберет все записи таблицы “Hobby” и каждую текущую будет хранить в переменной hobby. Внутри цикла лежат запросы на определенные атрибуты, такие как id, h_name, а также запрос высчитывающий количество людей занимающихся рассматриваемым хобби.

Подробнее о запросах можно прочесть в документации по RubyonRails в разделе «Интерфейс запросов Active Record»[1].

Сохраните файл.

  1. Перейдем к файлу поиска. Путь /app/views/pop_hobby/search.html.erb

Снова очистите имеющийся в нем по умолчанию код и напишем свой:

<h1>Отчет популярность хобби</h1>

<%= link_to 'Главная страница', controller: 'home_page' %><br><br>

<%= form_tag("search", method: "get") do %>

<%= label_tag(:q, "Поиск хобби:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("Искать") %><%= link_to 'Сбросить', controller: 'pop_hobby' %>

<% end %>

<table border="1">

<th>Код</th>

<th>Хобби</th>

<th>Числоувлеченных</th>

<%= Hobby.where("h_name = ?", params[:q]).find_each do |hobby| %>

<tr>

<td><%= hobby.id %></td>

<td><%= hobby.h_name %></td>

<td><%= HobbySotr.where(hobby_id: hobby.id).count %></td>

</tr>

<% end %>

Код будет практически идентичен, однако единственным отличием является наличие обработки не всех записей, а только тех чье название совпадает с текстом, введенным в поле поиска. Строка: <%= Hobby.where("h_name = ?", params[:q]).find_each do |hobby| %>.А также появилась ссылка «Сбросить», которая вернет отображаемую таблицу в изначальный вид.

Сохраните файл. Запустите сервер (команда в консоли: rails server). После перейдите на страницуurl: localhost:3000/pop_hobby/index у вас должна вывесить ошибка об отсутствии страницы home_pageкак на рисунке 5.2. Если у вас другая ошибка, то стоит вернуться и проверить, все ли действия были проделаны верно.

Рисунок 5.2 – Ошибка в контроллере Pop_hobby

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

  1. Пишем команду в консоли на создание нового контроллера:

rails g controller Uvl_hobby index search

  1. Открываемфайлпредставления/app/views/uvl_hobby/index.html.erb:

Очищаем старый код. Пишем новый:

<h1>Отчет увлеченность хобби сотрудников</h1>

<%= link_to 'Главная страница', controller: 'home_page' %>

<%= form_tag("search", method: "get") do %>

<%= label_tag(:q, "Поиск id:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("Искать") %>

<% end %>

<table border="1">

<th>Код</th>

<th>Фамилия</th>

<th>Имя</th>

<th>Отчество</th>

<th>Число хобби</th>

<%= Sotr.find_each do |sotr| %>

<tr>

<td><%= sotr.id %></td>

<td><%= sotr.s_fam %></td>

<td><%= sotr.s_name %></td>

<td><%= sotr.s_otch %></td>

<td><%= HobbySotr.where(sotr_id: sotr.id).count %></td>

</tr>

<% end %>

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

  1. Пропишем новый код и в файле представления поиска /app/views/uvl_hobby/search.html.erb:

<h1>Отчет увлеченность хобби сотрудников</h1>

<%= link_to 'Главная страница', controller: 'home_page' %><br><br>

<%= form_tag("search", method: "get") do %>

<%= label_tag(:q, "Поиск id:") %>

<%= text_field_tag(:q) %>

<%= submit_tag("Искать") %><%= link_to 'Сбросить', controller: 'uvl_hobby' %>

<% end %>

<table border="1">

<th>Код</th>

<th>Фамилия</th>

<th>Имя</th>

<th>Отчество</th>

<th>Число хобби</th>

<%= Sotr.where("id = ?", params[:q]).find_each do |sotr| %>

<tr>

<td><%= sotr.id %></td>

<td><%= sotr.s_fam %></td>

<td><%= sotr.s_name %></td>

<td><%= sotr.s_otch %></td>

<td><%= HobbySotr.where(sotr_id: sotr.id).count %></td>

</tr>

<% end %>

Не забудьте сохранить файлы.

Таким образом, мы создали два отчета. Настало время их посмотреть, однако как вы помните при предущем запуске у нас вывелась ошибка об отсутствии страницы «home_page», поэтому сначала создадим ее.

  1. Пропишем код создания нового контроллера в консоли:

rails g controller Home_page index

  1. Перейдем к страничке Indexнового контроллера. Путь: /app/views/home_page/index.html.erb:

Введем код, который будет отображать нашу главную страничку ИС:

<h1>Стартовая страница</h1>

<table>

<tr>

<td>

<h3>Справочники<h3>

</td>

</tr>

<tr>

<td>

<%= link_to 'Должности', controller: 'dlzhs'%><br>

<%= link_to 'Хобби', controller: 'hobbies'%><br>

<%= link_to 'Сотрудники', controller: 'sotrs'%><br>

<%= link_to 'Хобби сотрудников', controller: 'hobby_sotrs'%><br>

</td>

</tr>

<tr>

<td>

<h3>Отчеты<h3>

</td>

</tr>

<tr>

<td>

<%= link_to 'Популярность хобби', controller: 'pop_hobby' %><br>

</td>

</tr>

<tr>

<td>

<%= link_to 'Увлеченность хобби', controller: 'uvl_hobby' %><br>

</td>

</tr>

</table>

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

  1. Перейдем к файлу маршрутов в Rails /config/routes.rb

Пропишитестрочку:

root ‘home_page#index’

Удалите лишние комментарии, и у вас все должно выглядеть как на рисунке 5.3.

Рисунок 5.3 – Код файла routes.rb

Эта строка делает введенный адрес главной страницей, и теперь, когда вы будете обращаться по адресу: localhost:3000 у вас будет выводиться страница localhost:3000/home_page/index.

Примечание:

Проверьте, чтобы в папке проекта /public/ не лежало файла index.html, т.к. он будет заменять даже страницу прописанную в качестве главной в файле routes.rb

  1. Настало время проверить работу. Запустите сервер и перейдите по адресу: localhost:3000:

У вас должна отобразиться страница как рисунке 5.4.

Рисунок 5.4 – Главная страница ИС «Сотрудники»

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