Статьи Новости Контакты

11.04.2008
Александр Козлов

Куда ведут рельсы веб-разработки

обзор фреймворка Ruby on Rails и менеджера пакетов RubyGems

Вторая часть материала, посвященная языку программирования Ruby, в данном конкретном случае – Ruby on Rails. Для начала, как обычно, разберемся с тем, что же это такое. История RoR началась в июле 2004 года, когда состоялся релиз первой версии фреймворка, созданный Дэвидом Хэйнемеером Ханссоном (David Heinemeier Hansson), разработчиком из компании 37signals.

Итак, Ruby on Rails (в дальнейшем RoR) – это объектно-ориентированный программный каркас (фреймворк), рассчитанный на создание веб-приложений и написанный на языке программирования Ruby. RoR – это каркас «модель — представление — контроллер» для веб-приложений, что также обеспечивает интеграцию с веб-сервером и сервером базы данных.
Каркас приложения – это не ограничение свободы разработчика, а, скорее, четкая структуризация компонентов, которая вынуждает RoR быть логичным.
Фреймворк предоставляет однородную среду для разработки динамических AJAX-интерфейсов, обработки запросов и выдачи данных в контроллерах, а также для отражения предметной области в базе данных. Кроме того, RoR является открытым программным обеспечением, распространяемым под лицензией MIT.

Ruby on Rails обладает всем необходимым для быстрой и безболезненной веб-разработки
RoR имеет четыре основных принципа разработки веб-приложений.
 1. Приложения не могут определять собственную архитектуру, так как они используют готовый каркас «модель — представление — контроллер».
 2. Язык Ruby позволяет использовать легко читаемую нотацию, с помощью которой просто определить семантику приложения.
 3. RoR предоставляет механизмы повторного использования, позволяющие минимизировать дублирования кода в приложениях.
 4. Используются соглашения по конфигурации, типичные для большинства приложений.

Как уже было отмечено – архитектурой Ruby on Rails является каркас: модель — представление — контроллер (MVC). Попробуем разобрать эти три компонента более подробно.

Модель – предоставляет остальным компонентам объектно-ориентированное представление данных. Объекты модели осуществляют загрузку и сохранение в реляционной БД и реализуют бизнес-логику.
Благодаря динамической типизации в Ruby разработчику достаточно наследовать свой класс модели от базового класса, RoR автоматически связывает классы модели с таблицами в БД и создает атрибуты объектов.

Представление – создает пользовательский интерфейс для отображения полученных от контроллера данных, передает запросы пользователя на манипуляцию данными в контроллер. В RoR представление описывается при помощи шаблонов RHTML, которые представляют собой файлы HTML с дополнительными включениями фрагментов кода Ruby. Вывод, сгенерированный Ruby, включается в текст шаблона, после чего страница возвращается пользователю.
Представления могут использовать фрагменты других представлений и быть включенными в шаблоны более высокого уровня.

Контроллер – является основным компонентом, отвечающим за взаимодействие с пользователем. Контроллер считывает необходимые данные из модели и подготавливает их для отображения, а также сохраняет полученные данные в модели. В случае с RoR контроллером является класс. Открытые методы контроллера называются действиями, которые часто соответствуют отдельному представлению. К примеру, по запросу admin/list будет выдан метод list класса AdminController, а после использовано представление list.rhtml.

В плане интеграции RoR совместим с Apache, Lighttpd или другими веб-серверами, поддерживающими FastCGI. Для разработки и отладки используется встроенный в Ruby веб-сервер WEBrick или Mongrel.
Из баз данных поддерживаются MySQL, FireBird, PostgreSQL, IBM DB2, Oracle и Microsoft SQL Server. Также поддерживается и встраиваемая база данных SQLite.
Для разработки упомянутых Ajax-приложений в RoR интегрированы JavaScript-библиотеки Prototype и Script.aculo.us.

Но это все определения, посмотрим, что удобного и интересного есть в RoR.
Кроме уже упомянутого каркаса приложения стоит отметить удобную конфигурацию приложения.
Следуя базовым правилам именования компонентов, вы сможете избежать нудного конфигурирования. Изначальное разделение на среды выполнения — разработку, тест и выпуск – очень удобно.

Присутствует столь необходимый при ведении больших проектов контроль версий базы данных. Все изменения, которые вы делаете с базой данных, будь то создание таблиц, добавление индексов и т. д., будут помещаться в код приложения и храниться в вашей системе контроля версий. Каждая миграция выглядит примерно как:

Class AddEmailColumnToOrders < ActiveRecord::Migration
def self.up
add_column :orders, :e_mail, :string
end

def self.down
remove_column :orders, :e_mail
end
end

Мощная библиотека Active Record позволяет легкое и простое создание моделей для работы с объектами:

Class Order < ActiveRecord::Base
End

С развитием Ruby on Rails превратился из медленного инструмента "для себя" в мощный фреймворк, активно завоевывающий позиции
Этого вполне достаточно для таблицы orders. Никакого мэпинга, все связи реализованы удобно.

Удобно и тестирование приложения. Существует три типа тестов:
 1. Юнит-тесты моделей типа PHPUnit.
 2. Функциональные тесты – те же юнит-тесты, но для контроллеров.
 3. Интеграционные тесты сценариев работы веб-приложения.
Пример тестирования приложения на самом высоком уровне:

def test_buying_a_product
dave = regular_user
dave.get "/store/index"
dave.is_viewing «index»
dave.buys_a @ruby_book
dave.has_a_cart_containing @ruby_book
dave.checks_out DAVES_DETAILS
dave.is_viewing «index»
check_for_order DAVES_DETAILS, @ruby_book
end

Кеширование, также необходимое в крупных проектах. RoR может создать файл страницы в public-директории, который будет отдаваться веб-сервером как статический контент. Это пример кеширования страницы. Второй пример кеширования – это наблюдатели моделей, в которых разработчик сам определяет, когда стоит очищать кеш, к примеру:

class ArticleSweeper < ActionController::Caching::Sweeper
observe Article
# If we create a new article, the public list of articles must be regenerated
def after_create(article)
expire_public_page
end
# If we update an existing article, the cached version of that article is stale
def after_update(article)
expire_article_page(article.id)
end
# Deleting a page means we update the public list and blow away the cached article
def after_destroy(article)
expire_public_page
expire_article_page(article.id)
end
end

RoR обладает хорошей интеграцией Javascript (Prototype), обладает богатым выбором помощников для разработки Ajax-компонентов приложения. Генерация javascript при помощи RJS шаблонов выглядит так:

page.replace_html("cart" , :partial => «cart» , :object => @cart)
page[:current_item].visual_effect :highlight, :startcolor => "#88ff88", :endcolor => "#114411"

И последнее. Если в вашем приложении много javascript, а у пользователя он выключен, то легко оставить ему возможность работать с вашим ресурсом.
Кроме всего прочего, в RoR логично реализована система распознавания и генерирования friendly URL:

map.connect 'store/checkout', :conditions => { :method => :get }, :controller => «store», :action => «display_checkout_form»
map.connect 'store/checkout', :conditions => { :method => :post }, :controller => «store», :action => «save_checkout_form»

Дополнительно ко всему перечисленному – в RoR встроены скрипты профайлера и бенчмарка. Метод breakpoint, вызванный в action контроллера, прерывает работу скрипта страницы, позволяя разработчику выполнять любые действия с приложением посредством консоли, после чего продолжить выполнение скрипта.

Не каждый хостинг подойдет для Ruby on Rails
За сим техническая часть описания Ruby on Rails закончена, а на практическую лучше всего взглянуть вам самим. Хотя я думаю, что упоминание таких ресурсов, как Twitter и Scribd, заставляет задуматься о том, что Ruby on Rails – современный, удобный и мощный фреймворк. Из отечественных проектов, реализованных на RoR, стоит отметить красивый и удобный сервис ведения тлогов mmm-tasty, на примере которого можно рассмотреть все вышеупомянутые особенности в действии.

Для Ruby, как и для любого другого языка программирования, существует великое множество расширений, реализованных с помощью простого и удобного механизма – библиотек, написанных на языке C, позволяющих легко расширять функционал вашего приложения.
К примеру, для доступа к базам данных существует библиотека Ruby DBI, поддерживающая практически все распространенные БД типа SQLite, Oracle, ODBC, MySQL, DB2, MS SQL, InterBase и другие. Кроме унифицированных решений существуют и библиотеки для конкретных баз данных, поддерживающие специфичные операции каждой из них.
Графические библиотеки, такие как QtRuby/Korundum, позволяют привязывать код к оболочкам Qt и KDE, FxRuby – к графической библиотеке FOX, wxRuby – к кроссплатформенному пакету wxWidgets, написанному на C++. Кроме того, существует и библиотека для работы с OpenGL (открытая графическая библиотека), которая позволяет программировать 3D-графику.
К специфическим возможностям Win32 API позволяет обращаться библиотека Win32utils, а Rmagick предназначена для работы с изображениями и поддерживает более 100 различных форматов графики.
Ruport создана для реализации отчетов и ведения диаграмм на основе имеющихся данных из БД или из текстовых файлов CSV, а результаты можно сохранять в таких форматах, как PDF, HTML, TXT и CSV.

В нашей стране Ruby не менее популярен, чем на западе, и развивается семимильными шагами, о чем говорит количество отечественных расширений. К примеру, RuTils – обработчик русского языка, позволяющий реализовать сумму прописью и выбор числительного. К примеру, код:

231.propusju(2) => выдаст «двести тридцать одна», а
341.propusju_items(1, “чемодан”, “чемодана”, “чемоданов”) => напишет «триста сорок один чемодан».

Возможен и перевод в транслит, а также работа с датами.

Любой вопрос вы можете задать на форуме Ruby, где вам подробно ответят
Для управления библиотеками и программами Ruby существует менеджер пакетов под названием RubyGems, предоставляющий стандартный формат инструментов, предназначенных для простого управления расширениями (gems), а сервер — для их распространения, куда любой желающий может «вылить» свое творение.
Возможностей RubyGems хватит практически для любых запросов:
 — простая установка пакетов совместно с зависящими от них пакетами;
 — управление локальными пакетами;
 — управление зависимостями между пакетами;
 — поиск и просмотр локальных и удаленных пакетов;
 — поддержка нескольких версий для установки пакетов;
 — веб-интерфейс документаций.
 — простой интерфейс сборки пакетов.

Удачного вам написания кода и помните главный девиз людей, "разговаривающих" на Ruby:
"Все должно быть сделано максимально просто, но не проще".



Скоро на сайте

  • Wordpress

    Серия статей о плагинах к движку WordPrress
  • AJAX

    Проекты и продукты, ориентированные на AJAX
  • Новые сервисы Google

    Обзор новых сервисов Google
 

Copyright © 2003—2018 Все права защищены

При использовании материалов сайта ссылка на hostinfo.ru обязательна

  • хостинг от .masterhost
  • Rambler's Top100