Итак, прошлый шаг мы закончили на том, что позволили RoR сгенерировать нам первое приложение
Доброй традицией стало
Строки, начинающиеся с
Теперь
Немногословно, но страничка подсказывает нам, что файл находится в
Сохраним файл и обновим страничку:
Наверное, все эти генерации множества папок выглядят достаточно сомнительно для того, чтобы создать заурядную HTML страничку. Для того, чтобы начать использовать силу RoR, поработаем с Контроллером
Мы с вами уже знаем Руби, поэтому кодом нас не испугаешь: объявлены класс
Соответственно отредактируем Вид, чтобы показать переменные:
И тут мы видим, как код Руби внедряется в HTML. Для вывода значения переменной в HTML-код мы используем тэги
Для того, чтобы получить текущее время в Руби используется метод
Мы также можем добавлять некоторую логику в файлы Вида, например, чтобы создавать списки, мы можем использовать итераторы. Допустим, мы хотим вывести переменную
Осталось только переделать код в формат
Когда запускается код, 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/: Немногословно, но страничка подсказывает нам, что файл находится в
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>
Сохраним файл и обновим страничку:
Наверное, все эти генерации множества папок выглядят достаточно сомнительно для того, чтобы создать заурядную 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
заменили тэги <%= … %>
. А когда вывод кода нам не нужен мы просто опускаем =
в тэгах. Вот что у нас получилосьКак это работает?
Когда запускается код, RoR интерпретирует запрос
127.0.0.1:3000/hi/
как вызов Контроллера Hi
. У RoR есть редактируемый список правил роутинга запросов, по умолчанию первая часть запроса — имя Контроллера, вторая — метод в нем. Опять же, по умолчанию вызывается метод index
, поэтому мы не уточняли метод в запросе. Метод определяет необходимые базовые переменные. На этом работа Контроллера закончена и RoR передает данные в Вид. Как он знает, в какой Вид нужно передать данные? Работают conventions
— магия договоренностей об именовании. Эпилог
Мы поверхностно рассмотрели взаимодействие Контроллера и Вида, узнали, как оно проходит и почему работает, научились разделять логику между Видом и Контроллером. Мы еще углубимся в эту тему — здесь много интересных и важных подробностей, но чуть позже. Комментарии приветствуются в больших количествах!