- •Введение
- •1 Установка и запуск первого приложения
- •1.1 Установка системы Ruby on Rails
- •1.2 Разработка простейшего приложения с целью проверки работоспособности установленного по
- •2 Подготовка к выполнению проектирования ис
- •3 Настройка базы данных
- •4 Генерация временных платформ
- •5 Работа с контроллерами
- •6 Представления
- •7 Экспорт отчетов
- •8 Аутентификация пользователей
- •9 Многопользовательский режим
- •10 Разработка интерфейса
- •10.1 Стандартный Интернет-интерфейс
- •10.2 Расширение возможностей изменения интерфейса с помощью модуля Bootstrap
- •11 Элементы сложной обработки данных
- •11.1 Динамические средства поиска
- •Список использованных иточников
5 Работа с контроллерами
В предыдущем разделе, когда мы генерировали временные платформы (scaffold), в которых также создавались контроллеры, однако, когда наличие моделей или даже представлений не обязательно, то необходимо генерировать новые контроллеры отдельно. Процесс работы с контроллерами, мы рассмотрим на примере создания двух страниц с отчетами об увлеченности и популярности хобби сотрудников.
Пишем в консоли команду для создания нового контроллера:
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.
Откройте файл представления /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].
Сохраните файл.
Перейдем к файлу поиска. Путь /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
Первый отчет готов, посмотреть на его работу можно будет создав главную страничку, однако перед этим создадим второй аналогичный.
Пишем команду в консоли на создание нового контроллера:
rails g controller Uvl_hobby index search
Открываемфайлпредставления/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 %>
Разница от предыдущего только в том, что он ищет записи другой таблицы.
Пропишем новый код и в файле представления поиска /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», поэтому сначала создадим ее.
Пропишем код создания нового контроллера в консоли:
rails g controller Home_page index
Перейдем к страничке 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/ нам нужно настроить маршрутизацию.
Перейдем к файлу маршрутов в 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
Настало время проверить работу. Запустите сервер и перейдите по адресу: localhost:3000:
У вас должна отобразиться страница как рисунке 5.4.
Рисунок 5.4 – Главная страница ИС «Сотрудники»
Попробуйте переходы по ссылкам, и ввести данные в справочнике, чтобы они отобразились в отчетах, однако ввод будет пока затруднителен, эта проблема будет решаться в следующем разделе.