1. Бързо и чисто
Бръзо
с Рубин на Релси
Сава Чанков
sava.chankov@gmail.com
2. Какво е Rails
• Фреймуърк за бърза разработка на уеб
приложения, които съхраняват данните
си в SQL СУБД
• Извлечен е от работещо приложение
3. Какво Rails не е
• Система за управление на съдържание
• Платформа за интегриране на готови
компоненти
• Панацея за уеб разработка
4. Архитектура
• Модел - Изглед - Контролер
• Контрол на версиите на схемата на
базата данни (миграции)
• Автоматизация с Rake: по-добрият make
• Разширяване чрез приставки
5. Съставки
• Съвкупност от независими библиотеки
• ActiveRecord
• Модел
• Обектно-релационна съпоставка
• ActionPack
• Изглед + Контролер
• ActionMailer - обработка на е-поща
• ActionWebService - уеб услуги
• Rails - лепилото за всичко това
6. Модели
ActiveRecord съпоставя клас на всяка таблица
Таблица locomotives
Column | Type | Modifiers
----------+---------+-----------------------------------------------
id | integer | not null default nextval('locomotives_id_seq')
name | text | not null
max_speed | numeric | not null
↓
class Locomotive < ActiveRecord::Base
end
7. Модели
• ActiveRecord
• автоматично създава свойства на класа,
които отговарят на колоните в таблицата или
изгледа
• капсулира достъпа до базата данни
• добавя работна логика
8. Модели
• Конвенция над конфигурацията:
• имената на таблиците са в множествено
число (locomotives)
• имената на класовете - в единствено
(Locomotive)
• имената на съединителните таблици са
подредени азбучно (engineers_locomotives)
• първичен ключ e автоматично
инкрементираща се колона с име id
9. Модели
• Конвенцията е над конфигурацията, не
вместо
• Тя е просто удобство
• Когато е необходимо, може да не я
спазвате и да конфигурирате
10. Модели
• Асоциациите се описват чрез домейн
език
• class Train < AciveRecord::Base
belongs_to :locomotive
has_many :wagons
has_and_belongs_to_many :stations
end
• class Locomotive < ActiveRecord::Base
has_one :train
has_and_belongs_to_many :engineers
end
11. Модели
• Валидиране на данните
• задължително преди запис. При неуспех
грешките се записват в обекта.
• Callback функции в основните моменти от
живота на обекта
• преди и след валидиране, създаване,
променяне, изтриване
12. Модели
• Търсене с ModelClass.find()
• по първичен ключ (id)
• по зададени условия, съединения, подредба
• с пълна SQL заявка или фрагмент от нея
• чрез динамично генерирани от свойствата
методи find_by_X_and_Y
13. Модели
• Транзакции
• все още не могат да се влагат автоматично
• Възможност за оптимистично
заключване при конкурентна работа
• добавете колона lock_version в таблицата
• Наблюдатели (Observers)
• поведение на тригери извън базата данни
• Йерархии от класове
• цялото семейство се представят в една
таблица (single table inheritance)
14. Модели
• Поддържани бази данни:
• PostgreSQL, MySQL, Oracle, SQLite, DB2,
Firebird, Microsoft SQL Server, Sybase, Openbase
• Възможно е приложението да работи с
повече от една база данни (указва се за
всеки клас)
15. Изгледи
• Шаблони
• •.rhtml
embedded Ruby (ERb)
• кодът се грижи само за формлението, работната логика е в
контролерите и моделите
• •.rxml
създаване на XML чрез изпълнение на вложени блокове
xml.channel do
xml.title (quot;Заглавиеquot;)
end
<channel>
<title>Заглавие</title>
</channel>
16. Изгледи
• Шаблони
• • .rjs
генериране на JavaScript от библиотека на Ruby
• Улесняват изграждането на AJAX приложения
page.insert_html :after, @container_id, :partial => @object
page[:current_item].visual_effect :highlight,
:startcolor => quot;#88ff88quot;,
:endcolor => quot;#114411quot;
17. Изгледи
• Помощни методи
• подобряват читаемостта
• •много на брой вградени
link_to, options_for_select
• може да създавате собствени
18. Контролери
• Осъществяват връзката между
изгледите и моделите
• Методите им са действия
• всяко действие приблизително съответства на
уеб страница
• Eдно и също действие може да генерира
HTML, XML, JavaScript и пр. по желание
на клиента
19. Контролери
• Параметрите са в хеш
• params[:user]
• Възможност за еднократни нотификации
• flash['Благодарим Ви, че се регистрирахте']
• Конфигуриране на УРЛите чрез пътища
• map.connect '', :controller => quot;homequot;
20. Пощальонът Печкин
• ActionMailer
• изпращане на поща от приложението
• обикновен текст или HTML
• може да прикачва файлове
• използва шаблони за генерирането на
писмата
• по време на тестване може да изпраща
писмата до масив в паметта
21. На Вашите услуги
• ActionWebService
• Разбира XML-RPC и SOAP/RPC
• Автоматично генерира WSDL
22. Тестване
• Автоматично генериране на скелет на
тест при създаване на модел или
контролер
• Тестовите данни за базата данни се
съхраняват в YAML формат
• scoda:1
id:
name: 14-47
max_speed: 124.59
• всеки тест може да укаже данните на кои
таблици иска да зареди
fixtures :stations, :engineers
23. Тестване
• Три вида тестове в кутията:
• на модел (unit тест в термините на Rails)
• на контролер и свързаните с него изгледи
(функционален тест в термините на Rails)
• интеграционен - тестване на потребителски
сценарий
• Тестовете се изпълняват от командния
ред
• Rails автоматично стартира уеб сървър и
парсва отговорите му при функционални
и интеграционни тестове
24. Тестване
• А как да тестваме JavaScript?
• Unit тестване с приставката
javascript_test
• тества само JavaScript код
• автоматично стартира наличните браузъри
• поддържа Firefox, InternetExplorer, Konqueror и
Safari
• може добавите и други браузъри
• http://dev.rubyonrails.org/svn/rails/plugins/
javascript_test
25. Тестване
• А как да тестваме JavaScript-a на сложно
AJAX приложение с тестови данни?
• Приемни тестове със Selenium
• поддържа основните браузъри върху BSD/
Linux/Windows/Mac OS X
• тества директно в браузъра
• генериране на тестове чрез записване на
действия с приставката за Firefox Selenium IDE
• интегриран с Rails чрез приставки
• http://openqa.org/selenium/
26. Тестване със Selenium
• selenium-on-rails
• http://www.openqa.org/selenium-on-rails/
• selenium_jelly - Selenium RC
• браузърът и тестовият сървър може да са на
отделни машини
• http://svn.viney.net.nz/things/rails/plugins/
selenium_jelly/
• selenium_testing
• излиза от употреба
27. Дебъгване и
производителност
• Rails автоматично генерира при
създаване на приложението помощни
скриптове
• дебъгване по време на изпълнение от уеб
сървъра и при тестване - breakpointer
• Профилиране и измерване на
производителността profiler и benchmarker
28. Внедряване
• Capistrano
• не е част от Rails
• работи отдалечено по ssh
• •автоматизирате внедряването с рецепта:
изтегляне от хранилището (Subversion,CVS,darcs,git,...)
• мигриране на базата данни
• презареждане на уеб сървъра
• обаждане по телефона на системния администратор ако няма
връзка
• http://manuals.rubyonrails.com/read/book/17
29. Внедряване
• Като FastCGI приложение
• Apache, lighttpd
• mod_ruby - уви, не
• Ruby няма виртуална машина, а Rails не е
thread-safe - върху mod_ruby може да се
изпълнява само едно приложение
• По-добрият вариант - балансиращ
посредник + клъстер mongrel-и
• Mongrel е приложен сървър за Ruby
• http://mongrel.rubyforge.org/
30. Мащабиране
• Ако държите сесийната информация в
базата данни или на споделен дял,
мащабирането е тривиално
• Балансиране на натоварването между всички
звена - уеб сървърите, приложните сървъри и
базата данни
• http://www.loudthinking.com/arc/000479.html
• Кеширането е отлично поддържано
31. Добър вечер, приятелю млад,
320224320276320261321212321200
320262320265321207320265321
добре дошъл във България!
• За Ruby все още низовете са прости
последователности от байтове
• Затова винаги указвайте кодиране в
отговора на приложението
• $KCODE=’UTF8’
• Ограничена поддръжка на UTF-8 в регулярни
изрази и сравнения
• Операциите върху низове няма да работят
правилно
32. Добър вечер, приятелю млад,
добре дошъл във България!
• Rails 1.2 ще поддържа операции върху
многобайтови низове (length, capitalize,
truncate и пр.)
• quot;уникодquot;.chars.length
• => 6
• quot;уникодquot;.length
• => 12
• quot;уникодquot;.chars.capitalize.to_s
• => quot;Уникодquot;
34. Интернационализация
• Ruby-GetText за кода
• •използва инфраструктурата на gettext
.po файловете може да се превеждат от не-програмисти
• rake задачи за извличане и обновяване на низовете,
компилиране на .po в .mo
• превод на метаданните (таблици и колони)
• •работи дори когато няма превод
показват се низовете от езика по подразбиране
• •лесна употреба по време на разработка
_(quot;Остават ви #{minutes} минути до срещатаquot;)
35. Интернационализация
• Globalize за съдържанието
• ... и още няколко приставки
• подробно сравнение на
http://wiki.rubyonrails.com/rails/pages/
InternationalizationComparison
36. Предимства
• Мощен език
• Силна интеграция на тестването
• Автоматизация на задачите
• Конвенция пред конфигурация
• Лесно разширяване и промяна
• Мащабируемост
• Голяма общност
37. Недостатъци
• Ruby:
• слаба поддръжка на Уникод
• бавен е - няма виртуална машина
• В кода се промъква SQL
• Все още не е зряла платформа
• няма гаранция, че собствените ви разширения
ще работят без промяна с бъдещи версии на
Rails
38. Възможности
• Ruby:
• •най-сетне да се сдобие с виртуална машина
освен разработването на собствена се работи по пускането му
върху JVM и .NET
• поддръжка на Уникод
• Rails:
• API за разширяване
• Работа с не-SQL хранилища на данни
39. Заплахи
• Seaside - фреймуърк натранспорт правят
Субсидиите на пътния Smalltalk
• http://seaside.st
железниците нерентабилни
• Django, TurboGears - Python
• http://djangoproject.com/
• http://turbogears.org/
• PHP заплашва да изяде Rails на закуска
40. Среди за разработка
• Любимият ви текстов редактор (vim,emacs, kate,
gedit, jedit ... )
• FreeRIDE - IDE за Ruby
• http://freeride.rubyforge.org/
• RadRails - плъгин за Eclipse
• http://www.radrails.org/
• RDT - плъгин за Eclipse
• http://rubyeclipse.sourceforge.net/
• Само под Windows:
• RoRED
• RIDE-ME (Rails IDE - Minus Eclipse)
• Saphire Steel for Microsoft Visual Studio 2005
41. Ресурси за Ruby
• Първото издание на Кирката
• http://www.ruby-doc.org/docs/ProgrammingRuby/
(Open Publication License, v1.0)
• why's poignant guide to ruby
• http://poignantguide.net/ruby/
(Криейтив Комънс Признание-Споделяне на
споделеното 2.0)
42. Ресурси за Rails
• Започнете оттук - http://docs.rubyonrails.com/docs
• Официално уики - http://wiki.rubyonrails.org/
• Учебници и въведения - остаряват ужасно бързо
• http://www.digitalmediaminute.com/article/1816/
top-ruby-on-rails-tutorials
• Pragmatic programmers (Кирката, Скейта и
Рецептите)
• http://www.pragmaticprogrammer.com/
• Официален блог - http://weblog.rubyonrails.com/
• На български - http://www.bgonrails.com/