Статьи

Начало работы с MVC

Предоставлено Wikipedia

Ruby on Rails часто продвигается как веб-фреймворк MVC (но на самом деле Rails — это фреймворк Model 2-MVC, хотя я скоро вернусь к этому обсуждению) для создания современных промышленных веб-приложений. Ruby on Rails был впервые выпущен в июле 2004 года как проект с открытым исходным кодом, и примерно через 8 лет он стал одной из самых популярных доступных веб-фреймворков. Тем не менее, его шаблон проектирования, архитектура Model-View-Controller, более старый и уходит корнями далеко за пределы ниши веб-приложений.

история

Чтобы глубже понять структуру MVC, мы сначала изучим ее историю. Шаблон Model-View-Controller был сформулирован в 1970-х годах Тригве Реенскаугом как часть системы малых разговоров, разрабатываемой в Xerox PARC. Это было задолго до саги о Всемирной паутине и даже до того, как компьютеры стали личными. Система Smalltalk с шаблоном проектирования MVC сфокусирована на разделении интересов — принципе проектирования, на котором все современные веб-платформы основывают свои приоритеты. Они успешно отделили модель данных (часть обработки данных) от контента, а контент от представления. Они также внедрили промежуточную движущую силу, которая была первой в команде. Хотя он имел некоторые недостатки, он привлек веб-разработчиков, что привело к появлению многих ранних веб-фреймворков, использующих шаблон проектирования MVC (и, очевидно, превращающихся в де-факто стандарт для создания веб-приложений).

MVC Framework в Ruby on Rails

Перейдите к корню приложения rails и запустите

ls app/
assets helpers mailers models controllers views

view raw
gistfile1.txt
hosted with ❤ by GitHub

Как разработчик рельсов, вы потратите значительное количество времени на работу с каталогом app Как подчеркивалось выше, здесь также находятся модели, контроллеры и представления вашего приложения, которые являются фундаментальными для любого приложения, основанного на архитектуре MVC. Если вам интересно, как эта архитектура дизайна работает, вот краткий обзор, чтобы помочь вам начать.

Модель Модель-Вид-Контроллер в Rails

  1. Учтите, что браузер отправляет запрос на http: // localhost / page / show / 47. Этот запрос отправляется от вашего имени, когда вы нажимаете ссылку или вводите URI в адресную строку.
  2. Rails сопоставляет ваш запрос с конкретным контроллером, используя ‘config / rout.rb’. В нашем случае (http: // localhost / page / show / 47) Rails направляет ‘/ pages / show / 47’ методу ‘show’ в контроллере Pages и передает аргумент, id: 47.
  3. Controller Думайте о Контроллере как о невнимательном менеджере проекта, который любит делать то или иное дело. Он просто делит и назначает работу своим сотрудникам подряд. Он выдает заказы, а сотрудники обязаны принять заказ и что-то вернуть. Таким образом, действие show контроллера просит модель Page Контроллеры могут сделать гораздо больше, чем просто обрабатывать запросы пользователей.
  4. Модели выполняют тяжелую работу за кулисами, и их часто хвалят за их ловкость и мастерство. Модель, в ее истинном смысле, представляет данные и бизнес-логику вашего приложения. Модели обычно определяют, как данные обрабатываются. Но в Rails у нас есть ORM (объектно-реляционное отображение, вы можете прочитать об этом подробнее здесь ) с именем ActiveRecord, который связывает вместе бизнес-объекты и таблицы базы данных, чтобы создать постоянную модель. Для простоты и поскольку Rails реализует ActiveRecord из коробки, мы будем использовать модели и модели ActiveRecord как синонимы.

    В Rails модели — это классы ruby, которые взаимодействуют с базой данных. Да, они фактически общаются с базой данных (не кажется ли это немного жутким?). Модели имеют дело с проверкой данных, связью, транзакцией и многим другим. Поскольку они тесно связаны с базой данных, модели могут манипулировать записями данных и выполнять запросы SQL. Rails — это скорее соглашение, чем конфигурация. Следовательно, большую часть времени вы найдете таблицу в базе данных и соответствующую модель в вашем приложении с тем же именем.

  5. В нашем случае модель получит страницу 47 из базы данных.
  6. Модель возвращает полученные данные обратно в контроллер, и контроллер захватывает данные во временной ячейке памяти.
  7. Контроллер вызывает app / views / pages / show.html.erb и отображает HTML-файл. Поскольку «show.html.erb» находится в каталоге app / views, это, очевидно, представление. Итак, что такое взгляды? Представления выступают в качестве слоя представления для вашего приложения. Они воспринимают данные из контроллера и отображают версии XHTML, XML или javascript. Расширение файла ‘html.erb’ предполагает, что файл использует html со встроенным ruby. Встроенный ruby ​​(сокращенно Erb) позволяет добавлять произвольный объем динамического содержимого на статическую HTML-страницу. Другими словами, данные, извлеченные из базы данных, доступны для просмотра через встроенный код рубина. Скоро мы увидим взгляды в действии, чтобы прояснить ситуацию. «Показать представление» слепо принимает данные, предоставленные контроллером (стр. 47), и генерирует вывод html, который также включает заголовок, меню, контент, нижний колонтитул и т. Д.
  8. Контроллер возвращает HTML / XML и метаданные обратно в браузер, который отображается на вашем экране.

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

Поджигание MVC

Если вы с нетерпением ждали, чтобы увидеть MVC в действии, поднимите настроение! Мы собираемся начать! Откройте консоль и создайте новый проект Rails.

cd ~
rails new mvc_app

view raw
gistfile1.txt
hosted with ❤ by GitHub

Создайте контроллер для нашего mvc_app.

rails generate controller Pages index new create destroy —no-test-framework

view raw
gistfile1.txt
hosted with ❤ by GitHub

В Rails есть что-то волшебное. У RoR есть мощное заклинание, которое позволяет вам генерировать контроллеры, представления, модели и все вместе, не имея предварительных знаний о том, как работает Rails. ‘rails generate’ — это удобный и умный скрипт, который помогает вам работать с веб-разработчиками и работает из коробки.

Вышеперечисленная команда генерирует PagesControllerindexnewcreatedestroy Действия — это открытые методы, определенные на контроллере.

create app/controllers/pages_controller.rb
route get «pages/destroy»
route get «pages/create»
route get «pages/new»
route get «pages/index»
invoke erb
create app/views/pages
create app/views/pages/index.html.erb
create app/views/pages/new.html.erb
create app/views/pages/create.html.erb
create app/views/pages/destroy.html.erb
invoke test_unit
create test/functional/pages_controller_test.rb
invoke helper
create app/helpers/pages_helper.rb
invoke test_unit
create test/unit/helpers/pages_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/pages.js.coffee
invoke scss
create app/assets/stylesheets/pages.css.scss

view raw
gistfile1.txt
hosted with ❤ by GitHub

Ничего себе, все, что мы хотели, это контроллер для Pages, но Rails много сделал для этого, и теперь у нас есть несколько новых файлов. Не волнуйтесь, это важно для того, чтобы заставить контроллер работать. Сейчас самое время проверить наш новый pages_controller.

gedit app/controllers/pages_controller.rb

view raw
gistfile1.txt
hosted with ❤ by GitHub

class PagesController < ApplicationController
def index
end
def new
end
def create
end
def destroy
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Линия

class PagesController < ApplicationController

view raw
gistfile1.rb
hosted with ❤ by GitHub

сообщает компилятору, что PagesControllerApplicationControllerActionController::Base ActionController::Base

Наш контроллер содержит 4 различных действия (метода), но они пусты. В простом Ruby они бы ничего не делали, но область применения Rails выходит за рамки ruby. Вы могли заметить в фрагменте 1.4, что в каталоге app / views / pages было создано 4 новых представления, соответствующих каждому действию в контроллере.

create app/views/pages
create app/views/pages/index.html.erb
create app/views/pages/new.html.erb
create app/views/pages/create.html.erb
create app/views/pages/destroy.html.erb

view raw
gistfile1.txt
hosted with ❤ by GitHub

Поскольку действия пусты, контроллер отображает шаблон, соответствующий его имени. Например, действие index Поэтому, когда пользователь пытается перейти к http: // localhost / pages / index, вызывается действие index в контроллере страниц. Но поскольку метод index в pages_controller пуст, index.html.erb отображается, а HTML-код возвращается обратно в контроллер, который затем возвращается в браузер.

И вот недавно созданный индексный просмотр.

gedit app/views/pages/index.html.erb

view raw
gistfile1.txt
hosted with ❤ by GitHub

<h1>Pages#index</h1>
<p>Find me in app/views/pages/index.html.erb</p>

view raw
gistfile1.erb
hosted with ❤ by GitHub

Помимо текста-заполнителя, здесь особо нечего смотреть. В настоящее время наше представление представляет собой простой статический HTML-файл без динамического содержимого. Мы скоро представим встроенный Ruby в наши представления и посмотрим, как это работает.

Теперь у нас есть работающее приложение для рельсов (хотя оно ничего не дает).

Если вам не терпится увидеть ваше приложение в режиме реального времени, Rails позволяет вам запустить приложение в среде разработки с помощью WEBrick, библиотеки Ruby, и предлагает все основные сервисы веб-сервера.

Чтобы проверить ваше приложение, запустите

rails server

view raw
gistfile1.txt
hosted with ❤ by GitHub

и перейдите по адресу http: // localhost: 3000 / pages / index . В настоящий момент это очень просто, но целью этого руководства было начать работу с реализацией MVC в Rails.

Однако есть один важный вопрос, на который мы еще не ответили. Как веб-сервер отправляет запрос пользователя предполагаемому контроллеру? Когда браузер запросил http: // localhost: 3000 / pages / index, почему сервер использовал действие контроллера индекса, а не новый, создание или уничтожение контроллера? Именно здесь Rails Routes приходит на помощь. Определенные в контроллере действия становятся доступными для веб-сервера с помощью Rails Routes (config / rout.rb).

gedit config/routes.rb

view raw
gistfile1.txt
hosted with ❤ by GitHub

MvcApp::Application.routes.draw do
get «pages/index»
get «pages/new»
get «pages/create»
get «pages/destroy»

view raw
gistfile1.rb
hosted with ❤ by GitHub

Вы можете вспомнить, что когда мы генерировали контроллер, rails вызывал config / rout.rb. Это объясняет, как эти 4 строки кода попали туда.

Вот

get «pages/index»

view raw
gistfile1.rb
hosted with ❤ by GitHub

сопоставляет запросы для http: // localhost: 3000 / pages / index с действием index в pages_controller. Поскольку к правилу добавляется префикс get, его ответ ограничивается только запросами GET. Точно так же запрос страниц / new будет сопоставлен с новым действием.

Начало работы с MVC - Rails

Что дальше?

Эта статья была в основном написана с целью дать читателю введение в архитектуру MVC, а затем кратко обсудить передовые методы MVC. Но я оставлю это для другого поста.

Поскольку мы зашли так далеко, давайте пойдем дальше и создадим ресурс Pages. Вообще говоря, это таблица базы данных, и контроллер может выполнять операции CRUD (создание, чтение, обновление и удаление) над записями, включенными в эту таблицу. В нашем случае ресурс позволит вам рассматривать страницы как объекты, которые можно создавать, редактировать, обновлять и уничтожать. К концу этого урока у вас будет что-то похожее на приведенную ниже таблицу.

Находчивые маршруты

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

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

Итак, является ли Rails фреймворком MVC?

Теоретически, Rails не придерживается стандартов MVC. Классический MVC имел модели, которые могут уведомлять мнения об изменениях напрямую. Но в Rails данные модели отправляются в представления через контроллер, и именно контроллер возвращает HTML-вывод обратно в браузер. Это близко соответствует шаблону проектирования Model2, первоначально разработанному Sun Microsystems в конце 1990-х годов для разработки веб-приложений на Java. Но это не будет беспокоить разработчиков Rails, если у них есть вкусная чашка горячего кофе, в то время как код занят. 🙂

Не стесняйтесь делиться своими мыслями и комментариями!