Pull to refresh

Что мне приглянулось в Ruby on Rails

Ruby *
Начну с того, что я программист на РНР с неплохим опытом. Было написано много интересного, были крупные проекты, сервисы в сферы телекоммуникаций, покрывающие почти всю Европу. Разработка и поддержка проектов велась не месяц-два, а год-полтора.

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

Взгляд пал на Руби он Рейлс. Была прочитана знаменитая Agile Web Development with Rails: Second Edition и написан небольшой проект. Здесь я попытаюсь перечислить те возможности этого прекрасного фреймворка, которые приглянулись мне. Если вы не планируйте писать на рейлс, то думаю вам всё-таки будет интересно познакомиться с некоторыми вкусностями, которые можно без труда портировать на другие языки (многое уже сделано для РНР, в том числе и мной).

Каркас приложения (дело вкуса)
Да-да. Хоть многие и будут кричать, что это ограничение их свободы, но как показывает мой опыт — многих программистов просто необходимо ограничивать. Структура рейлс очень логична. Каждому компоненту есть своё место. Очень чёткое разделение компонентов MVC.

Конфигурация приложения (удобно)
Следуя базовым правилам именования компонентов приложения вы избегаете нудного конфигурирования. Изначальное разделение на среды выполнения: development, test и production — тоже хороший тон в программировании.

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

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

Этого достаточно для работы с таблицей orders. Никакого явного мэпинга. Очень удобно и гибко реализованы связи между сущностями.

Тестирование (необходимо в крупных проектах)
Тут одни эмоции. Есть три типа тестов:
1. юнит тесты моделей — а ля JUnit, 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

Это тестирование приложения на самом высоком уровне.

Кеширование (необходимо в крупных проектах)
Тут мне понравились 2 вещи. Первая — это кеширование страницы. Предположим по урлу /products/details/1 вы выводит описание товаров. Рейлс может создасть файл /products/detail/1.html в директории public, который будет отдаваться вебсервером как статический контент. Понятное дело, что это отлично отразится на производительности.
Вторая вещь — это наблюдатели (observers) моделей, в которых вы определяете когда следует очищать кеш. Например,

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

Яваскрипт (удобно)
1. хорошая интеграция с prototype,
2. богатый выбор хелперов для разработки аяксовых компонентов приложения,
3. генерация яваскрита при помощи шаблонов RJS (это тип представления из MVC); выглядит примерно так

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

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

Читабельные урлы (удобно)
Просто и логично сделана реализация распознавания и генерирования 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»

Дополн.
Отладка и прочее (удобно)
Встроены скрипты профайлера и бенчмарка. Метод breakpoint, вызванный в акшионе контроллера, прерывает работу скрипта страницы, позволяет вам выполнить любые действия с приложением через консоль, а потом продолжить выполнение скрипта.

Это то немногое, что я могу вспомнить в 11 часов вечера. Начинать холивары запрещено. Я просто перечислил то, что хотел бы видеть во всех проектах.
Tags:
Hubs:
Total votes 36: ↑32 and ↓4 +28
Views 3.2K
Comments Comments 99