Ruby on Rails шаг за шагом. #1 Теория

    Ненадолго отставив серию статей о ЯП Ruby в сторону (1, 2, 3, 4, 5, 6, 7, 8, 9, 10), решил презентовать вам новый цикл о фрэймворке Rails. Набравшись некоторого опыта в «обучении» попробую вывести эту серию на уровень качества и продуманности несколько выше, чем прежде.

    Целью первой части уроков по Ruby on Rails будет создание некоторого многопользовательского блога (аля Хабр). Также хочется отметить, что для этой первой части желательно иметь познание о Руби хотя бы на уровне трех-четырех капель. Хочется поскорей приступить к кодингу, но начинать все равно придется с теории.

    Что такое Ruby on Rails (далее RoR)? Самый распространненый ответ – это базирующийся на ЯП Ruby (далее Руби) фрэймворк, который реализует шаблон (далее паттерн) MVC. Выделим два главных пункта из ответа:
    • Это фрэймворк на базе Ruby
    • Он реализует паттерн MVC
    Разберем каждый отдельно.

    RoR – базирующийся на Руби фрэймворк


    ЯП Руби – простой и мощный, возможность мета-программинга, блоков, итераторов, а также обработки исключений делает язык замечательной основой для фрэймворка. Собственно так и посчитал Дэвид Хэйнемеер Ханссон, создатель RoR, и в июле 2004 года фрэймворк вышел на свет.
    Увидеть, как помогает мета-программирование Руби, можно увидеть в ORM компоненте RoR Active Record. Основываясь на имени класса, RoR считывает схему (schema) и налету создает объекты класса на базе таблицы БД. Можно перейти к следующему аспекту.

    RoR реализует MVC


    Возожно, вы уже слышали о MVC в отношении других фрэймворков, однако что представляет собой MVC в RoR? MVC – это паттерн архитектуры приложения, четко разделяющий три его компонента:
    • Model (далее Модель) является «сутью» приложения и отвечает за непосредственные алгоритмы, расчёты и тому подобное внутреннее устройство приложения. Также предоставляет линк к хранилищу данных.
    • View (Представление, дальше Вид) предназначен для вывода данных, предоставленных Моделью. Это единственная часть MVC, которая непосредственно контактирует с пользователем.
    • Controller (Поведение, далее Контроллер) получает данные от пользователя и передаёт их в Модель. Кроме того, он получает сообщения от Модели и передаёт их в Вид.


    Вот схема MVC:
    image
    Исходя из этого RoR использует три компонента:
    • Active Record
    • Action View
    • Action Controller

    Сочетание последних двух известно как Action Pack. Рассмотрим каждый компонент поближе, и узнаем, почему Руби так подходит для реализации фрэймворка.

    Active Record


    Active Record – это Модель в RoR. Модель хранит данные и предоставляет базу для работы с данными. Кроме этого Active Record также является ORM фрэймворком. ORM значит Object-relational mapping (Объектно-реляционная проекция). Собственно Active Record делает следующие вещи:
    • Проекция таблицы на класс. Каждая таблица проецируется на один или несколько классов по принципу convention over configuration (соглашение выше конфигурации). Одно из таких соглашений – имя таблицы должно быть во множественном числе, а название класса – в единственном. Атрибуты таблицы налету проецируются в атрибуты экземпляра Руби. После того, как все проекции сделаны, каждый объект ORM класса представляет определенную строку таблицы, с которой класс был спроецирован.
    • Соединение с БД. Вы можете подключиться к базе данных, используя API, предоставляемый Active Record, который создает необходимый вам запрос непосредственно в движок БД при помощи адаптеров. У Active Record есть адаптеры для MySQL, Postgres, MS SQLServer, DB2, и SQLite. Необходимо лишь записать параметры доступа к БД в файле database.yml.
    • Операции CRUD. Это операции create (создание), retrieve (получение), update (обновление) и delete (удаление) над таблицей. Так как Active Record – это ORM фрэймворк, вы всегда работаете с объектами. Чтобы создать новую строку таблицы, вы создаете новый объект класса и заполняете его переменные экземпляра значениями. Стоит заметить, что все это Active Record делает за вас.
    • Проверка данных. Проверка данных перед помещением их в таблицу – это первый шаг в безопасности вашего проекта. Active Record предоставляет проверку Модели. Данные могут быть проверены автоматически с помощью множества готовых методов, которые, в случае необходимости, можно переписать под собственные нужды.


    Action View


    Вид включает в себя логику, необходимую для вывода данных Модели. Роль Вида в RoR играет Action View. Наилее часто используемые функции Action View:
    • Шаблоны (Templates). Шаблоны – это файлы, содержащие заполнители (placeholders), которые буду заменены на контент. Шаблоны могут содержать HTML-код и код Ruby, встраиваемый в HTML с использованием синтакса встроенного (embedded) Ruby (ERb).
    • Помощники (helper, далее хелпер) форм и форматирования. Хелперы форм позволяют создавать такие элементы страниц, как чекбоксы, списки, используя готовые методы. В свою очередь хелперы форматирования позволяют форматировать данные необходимым нам способом, методы существуют для дат, валют и строк.
    • Макет. Макеты (layouts) определяют, как контент будет расположен на странице. Динамически создаваемая страница может содержать вложение из нескольких страниц, даже без использования таблиц и фрэймов, используя API Макета.

    Action Controller


    В веб-приложении Контроллер регулирует поток логики приложения. Он находится на границе программы, перехватывая все запросы, на основе которых он изменяет какой-то объект Модели и вызывает Вид, чтобы отобразить обновленные данные. В RoR Action Controller является Контроллером, вот его основные функции:
    • Поддержка сессий. Сессия – это период времени, проведенный пользователем на сайте. Его можно отследить с помощью cookie или объекта сессии. Cookie – небольшой файл, он не может содержать объекты, в отличие от объекта сессии.
    • Фильтрация. Бывают ситуации, когда необходимо вызвать определенный код, перед тем как исполнять логику Контроллера или после него, например, аутентификация пользователей, логирование событий, предоставление персонального ответа. Помогают в таких случаях фильтры, предоставляемые Action Controller. Существуют три основных фильтра: before, after и around. О них – позже.
    • Кэширование. Кэширование – это процесс, при котором наиболее запрашиваемый контент сохраняется в кэше, чтобы не было необходимости запрашивать его вновь и вновь.


    Три среды


    RoR поощряет использование отдельных сред для каждого из этапов цикла жизни приложения: разработка (development), тестирование (testing) и эксплуатация (production), для каждого из которых создается отдельная БД. Рассмотрим каждую среду.
    • development. В среде разработки ставка делается на немедленное отображение нового варианта при изменении кода – достаточно обновить страницу в браузере. Скорость в этой среде не важна. Когда случается ошибка, она выводится на экран.
    • test. При тестировании мы обычно каждый раз наполняем БД каким-нибудь глупым текстом, чтобы убедиться, что нормальное поведение не зависит от содержания БД. Процедуры юнит-тестинга и теста функциональности в RoR автоматизированы и производятся через консоль. Тестовая среда предоставляет отдельное пространство, в которых оперируют эти процедуры.
    • production. В конце концов ваше приложение выходит к финальной черте, пройдя тесты и избавившись от багов. Теперь обновления кода будут происходить редко и можно сконцентрироваться на производительности, включить кэширование. Нет необходимости писать огромные логи ошибок и пугать пользователей сообщениями об этих ошибках в браузере. Для вас – среда production.


    Эпилог


    Да, да, и тут эпилог — без него никуда ;) Сегодня мы с вами узнали о том, что такое MVC, как его реализуют Rails, узнали роль компонентов фрэймворка, узнали, как они сообщаются между собой. Взглянули даже на разные среды, которые предоставляют нам Rails. Если все понятненько, то можно начинать обустраивать рабочее место! Комментарии страстно желаемы ;)

    PS: Этот номер написан по мотивам книги Building Dynamic Web 2.0 Websites with Ruby on Rails. Однако с литературой по Rails стоит быть максимально осторожным, поскольку фрэймворк развивается неуловимыми темпами, и почти все книги (даже 2008 г. выпуска, в том числе и эта) основана на старых версиях Rails (1.2.x)
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 39
    • 0
      Жалко, конечно, что не утерпел «докапать», ну ладно, задел есть буду сам разбираться что и как в Ruby делается без фреймворков и библиотек сторонних

      P.S. Вот почитал описание RoR — один к одному (за исключением нюансов и языка :) ) symfony — MVC, ORM, среды и т. п., а судя по промелькнувшему database.yml не удивлюсь, если sсhema.yml из проекта симфони можно будет с минимальными изменениями использовать и рельсах

      P.P.S.

      Фразы
      -View… Это единственная часть MVC, которая непосредственно контактирует с пользователем.
      -Controller… получает данные от пользователя

      несколько противоречат друг другу. контроллер получает данные непосредственно от пользователя (часто через фронт-контроллер), но никак не через вью. Взаимодействие начинается в момент отправки http запроса, вью тогда вообще не существуит

      • +1
        Скорее уж наоборот, Symfony = ROR :)
        • +1
          я привык писать if (0 == var). а не if (var == 0) :)
          • –1
            т.е. Rails — это «0»?
            И вообще они всё сперли с php-фреймворка, да? :)
            • 0
              Ну ноль неудачно написал, каюсь :)
            • 0
              Надо просто писать:

              if(!var)
              • 0
                Когда-то давно исследовал эффективность такой записи на Си, 0 == var работало быстрее, не нужна была операция инверсии. Сейчас может умные компиляторы и поменяют

                not ax
                jnz…

                на

                jz…

                но тогда подопытный не меняд

                • +1
                  В руби 0 == true
            • +1
              симфони — практически порт рельсов на PHP
              • 0
                Хех, а в симфони бук написано, что только хелперы слизали :)
                Ну тем лучше, значит я рельсы почти знаю :)
                • +3
                  Нет, Symfony не порт Rails. Человек, видимо, не сильно опытен. Но очень и очень многое действительно повзаимствовано, в масштабах классов, но не фреймворка в целом.

                  И вы действительно почти знаете Ruby On Rails потому, что MVC — оно везде MVC :) Немного здравого смысла и несколько дней, чтобы освоиться и все. Для начала — достаточно.
                  • 0
                    Ну основы того, что сейчас называют MVC я «проходил» изучая VC++, МFC и «архитектуру документ-вид» от MS, концептуальной разницы не вижу :) А вот реализации MVC скажем в CI и в symfony довольно сильно разнятся, особенно если идти от «решил стать программистом, причем веб» к symfony сначала через «php3-style», а потом CI, то «ломать» себя придется больше раз :)
                    • 0
                      Точно… ну, ведь все логично) php3 style → php4 based framework → php5-based framerwok %)
                      • 0
                        Привел именно такую последовательность, потому что не раз (а два :) ) был свидетелем этого. Ну откровенно говоря между php3 style и CI у них были еще php3 style CMS в принципе приветствующие разделение кода и представления, ну и копи-паст использование php4 style (ООП), например для инициализации смарти
                • 0
                  Весьма качественный порт, который во многом превзошел свой прототип.

                  Возьмем например интернационализацию, которая появилась только в Релсах 2.2, а в Симфони была изначально, генератор админки, конфигурационные файлы, права доступа — всё это в симфони на уровне фреймворка.
                  • 0
                    Да! Конфиги, чуть лучшие скафолды (хотя все это есть в плагинах, кроме того — скафолды вообще вопрос очень спорный. В них верстка должна быть семантичной, а не красивой), интернационализация — вы правы. Именно по этому я говорю, что Symfony — не порт, а самостоятельный, во многом похожий фреймворк.
                    • +2
                      Ну да, можно конечно сказать, что многое конечно слизано из Рельсов, но если б Рельсы слизали многое с Сифони — цены б им не было :) Короче, Rails-like MVC-фрйемворки должны дружить %)
              • 0
                Кстати, еще по теме — мне очень помогают в изучении видеоподкасты Ryan Bates'a. Выходят по понедельникам. railscasts.com
              • 0
                хорошо написано. Подобной статьи мне не хватало, когда я только разбирался во всей этой блуде :)
                • 0
                  Кроме того, он получает сообщения от Модели и передаёт их в Контроллер.


                  Какая-то странная фраза. Из контроллера… в контроллер?
                  • 0
                    Тоже заметил, предложение неправильно построено. Скорее «Контроллер оперирует данными, полученными из модели»
                    • 0
                      Конечно же в Вид — каюсь и исправляю
                    • +1
                      > производство (production)
                      правильнее — промышленная эксплуатация…
                      • 0
                        Благодарю — мне, видимо, фантазии не хватило перевести
                      • 0
                        (...) Контроллер получает данные от пользователя и передаёт их в Модель. Кроме того, он получает сообщения от Модели и передаёт их в Контроллер.
                        Получается, что он получает сообщения от Модели и передает их сам себе.

                        Я далёк от программирования, но мне кажется, что здесь что-то другое имеется в виду.

                        Интересно почитать (мне-дизайнеру), потому что у нас RoR используется, хочется примерно понимать суть.

                        Спасибо.
                        • 0
                          Хорошая статья. Где вы были месяц назад? :)

                          Жду продолжения!
                          • +1
                            Написано познавательно, да. Однако мне, как человеку, малознакомому с RoR, так и осталось непонятно, что такое «Три среды». На каком уровне и в виде чего это реализовано?
                            • 0
                              Для каждого этапа свой набор переменных и констант окружения. Это позволяет при разработке не портить данные приложения выведенного в эксплуатацию. Для этого используются три разные базы данных (projecе_development, project_test, project_production, к примеру). При этом возможно использование разных СУБД.
                              Можно управлять: кэшированием (при разработке минимальный кэш, при эксплуатации максимально всё кэшируем), уровнем сообщений логгера, отправкой электронных писем (зачём нам заваливать ящики тестовым или разработческим спамом).
                              • 0
                                По аналогии с другими фреймворками могу предположить, что это набор конфигов (настройки подключения БД, кэширование, логирование, отладачная инфа и т. п.), который подключается в зависимости от url
                                • 0
                                  Господа, а обращайтесь в жабер / аську. Я буду очень рад с вами поговорить и рассказать про Ruby On Rails %)
                                • 0
                                  >>Исходя из этого RoR использует три компоненты:

                                  исправьте ошибку
                                  • 0
                                    ой а вы еще забыли Active Record!
                                  • 0
                                    Спасибо! Только сегодня ночью начал знакомство с рор (и с руби вообще) — попробовал сделать блог по известному скринкасту. Конечно поразился какой-то волшебной легкости и гибкости языка и среды разработки, хоть и многое не поняв. С практикой хорошо пошло, а теорию на английском читать лень — вы очень кстати.
                                    • 0
                                      Можно ссылочку, именно на данный скринкаст?
                                    • 0
                                      Статья понравилась. Уже неделю делаю делаю свой проект на рельсах и, как ты правильно заметил, документация устаревает ни по дням, а по ревизиям ;)
                                      • 0
                                        После окончания цикла статей RoR прогнозирую очередной бум на хабраподобные сайты… :)
                                        • 0
                                          Пользуясь случаем спрошу. Кто мне может посоветовать толковую документацию по работе с JS в рельсах?
                                          • 0
                                            Жду с продолжения. Пока пошел читать Гибкую разработку на RoR

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

                                            Самое читаемое