Pull to refresh

Ruby on Rails шаг за шагом. #3 Контроллер и Вид

Reading time5 min
Views20K
Итак, прошлый шаг мы закончили на том, что позволили RoR сгенерировать нам первое приложение test, на его базе мы и начнем знакомиться с возможностями фрэймворка. Как мы уже говорили, приложение RoR имеет строго определенную структуру, давайте посмотрим, для чего предназначены его папки:

  • app: динамическая часть вашего приложения
    controllers: интерфейс и деловая логика
    helpers: код для поддержки Видов
    models: объекты Модели, соотносящиеся с БД и используемые в приложении
    views: шаблоны для отсылки удаленному пользователю
    layouts: файлы макетов страниц
  • config: настройки среды, базы данных и приложения
    enviroments: конфигурации, относящиеся к средам
    initializers: конфигурационные файлы, обрабатывающиеся при запуске сервера
  • db: схема базы данных в виде миграций Active Record
  • doc: документация вашего веб-приложения
  • lib: библиотеки Руби, относящиеся к приложению
  • log: файлы логов
  • public: статическая часть вашего приложения
    stylesheets: CSS файлы
    javascripts: файлы JavaScript
    images: файлы изображений
  • script: Shell-скрипты для управления проектами RoR
  • test: код и данные для тестирования вашего приложения
    fixtures: даные, загружаемые в БД при тестировании
    functional: фунциональные тесты для проверки Контроллеров
    integration: интеграционные тесты
    unit: Юнит-тесты для проверки Моделей
  • tmp: здесь Rais хранит временные данные
  • vendor: внешние библиотеки, используемые приложением
    plugins: плагины RoR

Доброй традицией стало “Hello World” в качестве примера работы любого ЯП или движка. Что ж, давайте сделаем страничку, которая будет приветствовать нас. Мы знаем, что приложение на RoR должно состоять из трех компонентов: Вида, Контроллера и Модели. Сказать привет – это просто, достаточно передать браузеру HTML-код. Несложно догадаться, что HTML должен содержаться в Виде, однако RoR не позволяет создавать виды напрямую, так как Вид должен быть непосредственно ассоциирован с Контроллером. Чтобы сгенерировать что-нибудь в RoR, нужно идти в командную строку (мы уже знаем, как это делается) и переместиться в папку приложения. Тут мы и командуем:
ruby script/generate controller Hi index

script/generate – это Shell-скрипт generate в папке script, написанный на Руби, поэтому запускать скрипт нужно через интерпретатор (для этого мы добавила ruby в начале команды). Так же мы передали скрипту два аргумента: controller определяет, что необходимо сгенерировать код Контроллера, в данном случае он будет назваться Hi – это говорит второй аргумент. А index в конце команды привяжет к контроллеру Вид index, что, собственно, нам и требовалось. Немого подождем, и вот что выдаст нам скрипт:
exists   app/controllers/<br>exists   app/helpers/<br>create   app/views/hi<br>exists   test/functional/<br>create   app/controllers/hi_controller.rb<br>create   test/functional/hi_controller_test.rb<br>create   app/helpers/hi_helper.rb<br>create   app/views/hi/index.html.erb

Строки, начинающиеся с exists, показывают папки и файлы, который генератор хотел создать, но они уже были на месте. Зная о структуре папок, мы уже можем сказать, что были созданы: папка hi в Видах, Контроллер, шаблон для создания тестов, хэлпер и файл Вида index.html.erb (формат .html.erb – это сочетание HTML и кода Руби).

Теперь index стал доступен для приложения. Давайте запустим сервер и заглянем в http://127.0.0.1:3000/hi/:

image

Немногословно, но страничка подсказывает нам, что файл находится в app/views/hi/index.html.erb. Открыв его, вы заметите, что в коде даже нет базовой структуры HTML. Давайте немного дополним файл и приведем его в более порядочный вид:
<html>
<
head><title>Hi Habrahabr!</title></head>
<
body>
<
h1>Hello!</h1>
<
p>Это приветствие прибыло из app/views/hi/index.html.erb</p>
</
body>
</
html>

Сохраним файл и обновим страничку:

image

Наверное, все эти генерации множества папок выглядят достаточно сомнительно для того, чтобы создать заурядную HTML страничку. Для того, чтобы начать использовать силу RoR, поработаем с Контроллером app/controllers/hi_controller.rb. Вот, что в нем находится:
class HiController < ApplicationController
def index
end

end

Мы с вами уже знаем Руби, поэтому кодом нас не испугаешь: объявлены класс HiController (заметим, что название класса было сгенерировано на основе имени Контроллера — это CoC и мы еще будем говорить почему и зачем), который является потомком класса ApplicationController и пустой метод index. Давате пофантазируем с методом, задавая в нем переменные и отображая их в Виде. Для этого в RoR используются переменные экземпляра (те самые, который начинаются с @):
class HiController < ApplicationController
def index
    
@habr = 'Habrahabr'
    
@message = 'Это сообщение пришло из Контроллера'
end
end

Соответственно отредактируем Вид, чтобы показать переменные:
<html>
<
head><title>Hi <%= @habr %>!</title></head>
<
body>
<
h1>Hello!</h1>
<
p>Это приветствие прибыло из app/views/hi/index.html.erb</p>
<
p><%= @message %></p>
</
body>
</
html>

И тут мы видим, как код Руби внедряется в HTML. Для вывода значения переменной в HTML-код мы используем тэги <%= … %> – это так называемое выражение (expression).

Для того, чтобы получить текущее время в Руби используется метод Time.now. Достаточно вставить в HTML <%= Time.now %>, однако стоит использовать преимущества MVC и делать расчеты в Контроллере. Попробуйте “считать” время в Контроллере и отбразить его на странице Вида.

Логика в Виде


Мы также можем добавлять некоторую логику в файлы Вида, например, чтобы создавать списки, мы можем использовать итераторы. Допустим, мы хотим вывести переменную @message пять раз в параграфах. Мы знаем, как сделать это на чистом Руби:
5.times do
puts "<p> #{@message} </p>" # немного неверно, но неважно
end

Осталось только переделать код в формат .erb, получается даже несколько проще:
<% 5.times do%>
<p><%= @message %></p>
<% end %>
puts заменили тэги <%= … %>. А когда вывод кода нам не нужен мы просто опускаем = в тэгах. Вот что у нас получилось

image

Как это работает?



Когда запускается код, RoR интерпретирует запрос 127.0.0.1:3000/hi/ как вызов Контроллера Hi. У RoR есть редактируемый список правил роутинга запросов, по умолчанию первая часть запроса — имя Контроллера, вторая — метод в нем. Опять же, по умолчанию вызывается метод index, поэтому мы не уточняли метод в запросе. Метод определяет необходимые базовые переменные. На этом работа Контроллера закончена и RoR передает данные в Вид. Как он знает, в какой Вид нужно передать данные? Работают conventions — магия договоренностей об именовании.

Эпилог


Мы поверхностно рассмотрели взаимодействие Контроллера и Вида, узнали, как оно проходит и почему работает, научились разделять логику между Видом и Контроллером. Мы еще углубимся в эту тему — здесь много интересных и важных подробностей, но чуть позже. Комментарии приветствуются в больших количествах!
Tags:
Hubs:
Total votes 15: ↑10 and ↓5+5
Comments20

Articles