Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Quick and Clean with Ruby on Rails

2,809 views

Published on

Разработване, тестване, интернационализация на уеб приложения с Ruby on Rails. Представена на OpenFest 2006.

Published in: Technology
  • Be the first to comment

Quick and Clean with Ruby on Rails

  1. 1. Бързо и чисто Бръзо с Рубин на Релси Сава Чанков sava.chankov@gmail.com
  2. 2. Какво е Rails • Фреймуърк за бърза разработка на уеб приложения, които съхраняват данните си в SQL СУБД • Извлечен е от работещо приложение
  3. 3. Какво Rails не е • Система за управление на съдържание • Платформа за интегриране на готови компоненти • Панацея за уеб разработка
  4. 4. Архитектура • Модел - Изглед - Контролер • Контрол на версиите на схемата на базата данни (миграции) • Автоматизация с Rake: по-добрият make • Разширяване чрез приставки
  5. 5. Съставки • Съвкупност от независими библиотеки • ActiveRecord • Модел • Обектно-релационна съпоставка • ActionPack • Изглед + Контролер • ActionMailer - обработка на е-поща • ActionWebService - уеб услуги • Rails - лепилото за всичко това
  6. 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. 7. Модели • ActiveRecord • автоматично създава свойства на класа, които отговарят на колоните в таблицата или изгледа • капсулира достъпа до базата данни • добавя работна логика
  8. 8. Модели • Конвенция над конфигурацията: • имената на таблиците са в множествено число (locomotives) • имената на класовете - в единствено (Locomotive) • имената на съединителните таблици са подредени азбучно (engineers_locomotives) • първичен ключ e автоматично инкрементираща се колона с име id
  9. 9. Модели • Конвенцията е над конфигурацията, не вместо • Тя е просто удобство • Когато е необходимо, може да не я спазвате и да конфигурирате
  10. 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. 11. Модели • Валидиране на данните • задължително преди запис. При неуспех грешките се записват в обекта. • Callback функции в основните моменти от живота на обекта • преди и след валидиране, създаване, променяне, изтриване
  12. 12. Модели • Търсене с ModelClass.find() • по първичен ключ (id) • по зададени условия, съединения, подредба • с пълна SQL заявка или фрагмент от нея • чрез динамично генерирани от свойствата методи find_by_X_and_Y
  13. 13. Модели • Транзакции • все още не могат да се влагат автоматично • Възможност за оптимистично заключване при конкурентна работа • добавете колона lock_version в таблицата • Наблюдатели (Observers) • поведение на тригери извън базата данни • Йерархии от класове • цялото семейство се представят в една таблица (single table inheritance)
  14. 14. Модели • Поддържани бази данни: • PostgreSQL, MySQL, Oracle, SQLite, DB2, Firebird, Microsoft SQL Server, Sybase, Openbase • Възможно е приложението да работи с повече от една база данни (указва се за всеки клас)
  15. 15. Изгледи • Шаблони • •.rhtml embedded Ruby (ERb) • кодът се грижи само за формлението, работната логика е в контролерите и моделите • •.rxml създаване на XML чрез изпълнение на вложени блокове xml.channel do xml.title (quot;Заглавиеquot;) end <channel> <title>Заглавие</title> </channel>
  16. 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. 17. Изгледи • Помощни методи • подобряват читаемостта • •много на брой вградени link_to, options_for_select • може да създавате собствени
  18. 18. Контролери • Осъществяват връзката между изгледите и моделите • Методите им са действия • всяко действие приблизително съответства на уеб страница • Eдно и също действие може да генерира HTML, XML, JavaScript и пр. по желание на клиента
  19. 19. Контролери • Параметрите са в хеш • params[:user] • Възможност за еднократни нотификации • flash['Благодарим Ви, че се регистрирахте'] • Конфигуриране на УРЛите чрез пътища • map.connect '', :controller => quot;homequot;
  20. 20. Пощальонът Печкин • ActionMailer • изпращане на поща от приложението • обикновен текст или HTML • може да прикачва файлове • използва шаблони за генерирането на писмата • по време на тестване може да изпраща писмата до масив в паметта
  21. 21. На Вашите услуги • ActionWebService • Разбира XML-RPC и SOAP/RPC • Автоматично генерира WSDL
  22. 22. Тестване • Автоматично генериране на скелет на тест при създаване на модел или контролер • Тестовите данни за базата данни се съхраняват в YAML формат • scoda:1 id: name: 14-47 max_speed: 124.59 • всеки тест може да укаже данните на кои таблици иска да зареди fixtures :stations, :engineers
  23. 23. Тестване • Три вида тестове в кутията: • на модел (unit тест в термините на Rails) • на контролер и свързаните с него изгледи (функционален тест в термините на Rails) • интеграционен - тестване на потребителски сценарий • Тестовете се изпълняват от командния ред • Rails автоматично стартира уеб сървър и парсва отговорите му при функционални и интеграционни тестове
  24. 24. Тестване • А как да тестваме JavaScript? • Unit тестване с приставката javascript_test • тества само JavaScript код • автоматично стартира наличните браузъри • поддържа Firefox, InternetExplorer, Konqueror и Safari • може добавите и други браузъри • http://dev.rubyonrails.org/svn/rails/plugins/ javascript_test
  25. 25. Тестване • А как да тестваме JavaScript-a на сложно AJAX приложение с тестови данни? • Приемни тестове със Selenium • поддържа основните браузъри върху BSD/ Linux/Windows/Mac OS X • тества директно в браузъра • генериране на тестове чрез записване на действия с приставката за Firefox Selenium IDE • интегриран с Rails чрез приставки • http://openqa.org/selenium/
  26. 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. 27. Дебъгване и производителност • Rails автоматично генерира при създаване на приложението помощни скриптове • дебъгване по време на изпълнение от уеб сървъра и при тестване - breakpointer • Профилиране и измерване на производителността profiler и benchmarker
  28. 28. Внедряване • Capistrano • не е част от Rails • работи отдалечено по ssh • •автоматизирате внедряването с рецепта: изтегляне от хранилището (Subversion,CVS,darcs,git,...) • мигриране на базата данни • презареждане на уеб сървъра • обаждане по телефона на системния администратор ако няма връзка • http://manuals.rubyonrails.com/read/book/17
  29. 29. Внедряване • Като FastCGI приложение • Apache, lighttpd • mod_ruby - уви, не • Ruby няма виртуална машина, а Rails не е thread-safe - върху mod_ruby може да се изпълнява само едно приложение • По-добрият вариант - балансиращ посредник + клъстер mongrel-и • Mongrel е приложен сървър за Ruby • http://mongrel.rubyforge.org/
  30. 30. Мащабиране • Ако държите сесийната информация в базата данни или на споделен дял, мащабирането е тривиално • Балансиране на натоварването между всички звена - уеб сървърите, приложните сървъри и базата данни • http://www.loudthinking.com/arc/000479.html • Кеширането е отлично поддържано
  31. 31. Добър вечер, приятелю млад, 320224320276320261321212321200 320262320265321207320265321 добре дошъл във България! • За Ruby все още низовете са прости последователности от байтове • Затова винаги указвайте кодиране в отговора на приложението • $KCODE=’UTF8’ • Ограничена поддръжка на UTF-8 в регулярни изрази и сравнения • Операциите върху низове няма да работят правилно
  32. 32. Добър вечер, приятелю млад, добре дошъл във България! • Rails 1.2 ще поддържа операции върху многобайтови низове (length, capitalize, truncate и пр.) • quot;уникодquot;.chars.length • => 6 • quot;уникодquot;.length • => 12 • quot;уникодquot;.chars.capitalize.to_s • => quot;Уникодquot;
  33. 33. Internationalisierung • Не се поддържа в ядрото на Rails... • ...но има няколко приставки Интернационализация
  34. 34. Интернационализация • Ruby-GetText за кода • •използва инфраструктурата на gettext .po файловете може да се превеждат от не-програмисти • rake задачи за извличане и обновяване на низовете, компилиране на .po в .mo • превод на метаданните (таблици и колони) • •работи дори когато няма превод показват се низовете от езика по подразбиране • •лесна употреба по време на разработка _(quot;Остават ви #{minutes} минути до срещатаquot;)
  35. 35. Интернационализация • Globalize за съдържанието • ... и още няколко приставки • подробно сравнение на http://wiki.rubyonrails.com/rails/pages/ InternationalizationComparison
  36. 36. Предимства • Мощен език • Силна интеграция на тестването • Автоматизация на задачите • Конвенция пред конфигурация • Лесно разширяване и промяна • Мащабируемост • Голяма общност
  37. 37. Недостатъци • Ruby: • слаба поддръжка на Уникод • бавен е - няма виртуална машина • В кода се промъква SQL • Все още не е зряла платформа • няма гаранция, че собствените ви разширения ще работят без промяна с бъдещи версии на Rails
  38. 38. Възможности • Ruby: • •най-сетне да се сдобие с виртуална машина освен разработването на собствена се работи по пускането му върху JVM и .NET • поддръжка на Уникод • Rails: • API за разширяване • Работа с не-SQL хранилища на данни
  39. 39. Заплахи • Seaside - фреймуърк натранспорт правят Субсидиите на пътния Smalltalk • http://seaside.st железниците нерентабилни • Django, TurboGears - Python • http://djangoproject.com/ • http://turbogears.org/ • PHP заплашва да изяде Rails на закуска
  40. 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. 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. 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/
  43. 43. ÿ р à ! ä î î ò ãà à ç èå ë í Á à ì è í â

×