43
Бързо и чисто с Рубин на Релси Сава Чанков [email protected]

Quick and Clean with Ruby on Rails

  • Upload
    sava

  • View
    2.413

  • Download
    3

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Quick and Clean with Ruby on Rails

Бръзо Бързо и чистос Рубин на Релси

Сава Чанков[email protected]

Page 2: Quick and Clean with Ruby on Rails

Какво е Rails• Фреймуърк за бърза разработка на уеб приложения, които съхраняват данните си в SQL СУБД

• Извлечен е от работещо приложение

Page 3: Quick and Clean with Ruby on Rails

Какво Rails не е• Система за управление на съдържание• Платформа за интегриране на готови компоненти

• Панацея за уеб разработка

Page 4: Quick and Clean with Ruby on Rails

Архитектура• Модел - Изглед - Контролер• Контрол на версиите на схемата на базата данни (миграции)

• Автоматизация с Rake: по-добрият make• Разширяване чрез приставки

Page 5: Quick and Clean with Ruby on Rails

Съставки• Съвкупност от независими библиотеки• ActiveRecord

• Модел• Обектно-релационна съпоставка

• ActionPack• Изглед + Контролер

• ActionMailer - обработка на е-поща• ActionWebService - уеб услуги • Rails - лепилото за всичко това

Page 6: Quick and Clean with Ruby on Rails

Модели

Column | Type | Modifiers ----------+---------+-----------------------------------------------id | integer | not null default nextval('locomotives_id_seq')name | text | not nullmax_speed | numeric | not null

class Locomotive < ActiveRecord::Baseend

ActiveRecord съпоставя клас на всяка таблица

Таблица locomotives

Page 7: Quick and Clean with Ruby on Rails

Модели• ActiveRecord

• автоматично създава свойства на класа, които отговарят на колоните в таблицата или изгледа

• капсулира достъпа до базата данни • добавя работна логика

Page 8: Quick and Clean with Ruby on Rails

Модели• Конвенция над конфигурацията:

• имената на таблиците са в множествено число (locomotives)

• имената на класовете - в единствено (Locomotive)

• имената на съединителните таблици са подредени азбучно (engineers_locomotives)

• първичен ключ e автоматично инкрементираща се колона с име id

Page 9: Quick and Clean with Ruby on Rails

Модели• Конвенцията е над конфигурацията, не

вместо

• Тя е просто удобство• Когато е необходимо, може да не я спазвате и да конфигурирате

Page 10: Quick and Clean with Ruby on Rails

Модели• Асоциациите се описват чрез домейн език• class Train < AciveRecord::Base

belongs_to :locomotive has_many :wagons has_and_belongs_to_many :stationsend

• class Locomotive < ActiveRecord::Base has_one :train has_and_belongs_to_many :engineersend

Page 11: Quick and Clean with Ruby on Rails

Модели• Валидиране на данните

• задължително преди запис. При неуспех грешките се записват в обекта.

• Callback функции в основните моменти от живота на обекта• преди и след валидиране, създаване, променяне, изтриване

Page 12: Quick and Clean with Ruby on Rails

Модели• Търсене с ModelClass.find()

• по първичен ключ (id)• по зададени условия, съединения, подредба• с пълна SQL заявка или фрагмент от нея• чрез динамично генерирани от свойствата методи find_by_X_and_Y

Page 13: Quick and Clean with Ruby on Rails

Модели• Транзакции

• все още не могат да се влагат автоматично• Възможност за оптимистично заключване при конкурентна работа • добавете колона lock_version в таблицата

• Наблюдатели (Observers) • поведение на тригери извън базата данни

• Йерархии от класове • цялото семейство се представят в една таблица (single table inheritance)

Page 14: Quick and Clean with Ruby on Rails

Модели• Поддържани бази данни:

• PostgreSQL, MySQL, Oracle, SQLite, DB2, Firebird, Microsoft SQL Server, Sybase, Openbase

• Възможно е приложението да работи с повече от една база данни (указва се за всеки клас)

Page 15: Quick and Clean with Ruby on Rails

Изгледи• Шаблони

• .rhtml • embedded Ruby (ERb)• кодът се грижи само за формлението, работната логика е в

контролерите и моделите

• .rxml• създаване на XML чрез изпълнение на вложени блокове

xml.channel do xml.title ("Заглавие")end

<channel><title>Заглавие</title></channel>

Page 16: Quick and Clean with Ruby on Rails

Изгледи• Шаблони

• .rjs • генериране на JavaScript от библиотека на Ruby• Улесняват изграждането на AJAX приложения

page[:current_item].visual_effect :highlight, :startcolor => "#88ff88", :endcolor => "#114411"

page.insert_html :after, @container_id, :partial => @object

Page 17: Quick and Clean with Ruby on Rails

Изгледи• Помощни методи

• подобряват читаемостта• много на брой вградени

• link_to, options_for_select

• може да създавате собствени

Page 18: Quick and Clean with Ruby on Rails

Контролери• Осъществяват връзката между изгледите и моделите

• Методите им са действия• всяко действие приблизително съответства на уеб страница

• Eдно и също действие може да генерира HTML, XML, JavaScript и пр. по желание на клиента

Page 19: Quick and Clean with Ruby on Rails

Контролери• Параметрите са в хеш

• params[:user]

• Възможност за еднократни нотификации• flash['Благодарим Ви, че се регистрирахте']

• Конфигуриране на УРЛите чрез пътища• map.connect '', :controller => "home"

Page 20: Quick and Clean with Ruby on Rails

Пощальонът Печкин• ActionMailer

• изпращане на поща от приложението• обикновен текст или HTML• може да прикачва файлове• използва шаблони за генерирането на писмата

• по време на тестване може да изпраща писмата до масив в паметта

Page 21: Quick and Clean with Ruby on Rails

На Вашите услуги• ActionWebService

• Разбира XML-RPC и SOAP/RPC• Автоматично генерира WSDL

Page 22: Quick and Clean with Ruby on Rails

Тестване• Автоматично генериране на скелет на тест при създаване на модел или контролер

• Тестовите данни за базата данни се съхраняват в YAML формат•scoda:

id: 1 name: 14-47 max_speed: 124.59

• всеки тест може да укаже данните на кои таблици иска да зареди fixtures :stations, :engineers

Page 23: Quick and Clean with Ruby on Rails

Тестване• Три вида тестове в кутията:

• на модел (unit тест в термините на Rails)• на контролер и свързаните с него изгледи

(функционален тест в термините на Rails)• интеграционен - тестване на потребителски сценарий

• Тестовете се изпълняват от командния ред

• Rails автоматично стартира уеб сървър и парсва отговорите му при функционални и интеграционни тестове

Page 24: Quick and Clean with Ruby on Rails

Тестване• А как да тестваме JavaScript?• Unit тестване с приставката

javascript_test• тества само JavaScript код• автоматично стартира наличните браузъри• поддържа Firefox, InternetExplorer, Konqueror и

Safari• може добавите и други браузъри• http://dev.rubyonrails.org/svn/rails/plugins/

javascript_test

Page 25: Quick and Clean with Ruby on Rails

Тестване• А как да тестваме JavaScript-a на сложно

AJAX приложение с тестови данни?• Приемни тестове със Selenium

• поддържа основните браузъри върху BSD/Linux/Windows/Mac OS X

• тества директно в браузъра• генериране на тестове чрез записване на действия с приставката за Firefox Selenium IDE

• интегриран с Rails чрез приставки• http://openqa.org/selenium/

Page 26: Quick and Clean with Ruby on Rails

Тестване със 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 • излиза от употреба

Page 27: Quick and Clean with Ruby on Rails

Дебъгване и производителност

• Rails автоматично генерира при създаване на приложението помощни скриптове• дебъгване по време на изпълнение от уеб сървъра и при тестване - breakpointer

• Профилиране и измерване на производителността profiler и benchmarker

Page 28: Quick and Clean with Ruby on Rails

Внедряване• Capistrano

• не е част от Rails• работи отдалечено по ssh• автоматизирате внедряването с рецепта:

• изтегляне от хранилището (Subversion,CVS,darcs,git,...)• мигриране на базата данни• презареждане на уеб сървъра• обаждане по телефона на системния администратор ако няма

връзка

• http://manuals.rubyonrails.com/read/book/17

Page 29: Quick and Clean with Ruby on Rails

Внедряване• Като FastCGI приложение

• Apache, lighttpd• mod_ruby - уви, не

• Ruby няма виртуална машина, а Rails не е thread-safe - върху mod_ruby може да се изпълнява само едно приложение

• По-добрият вариант - балансиращ посредник + клъстер mongrel-и• Mongrel е приложен сървър за Ruby• http://mongrel.rubyforge.org/

Page 30: Quick and Clean with Ruby on Rails

Мащабиране• Ако държите сесийната информация в базата данни или на споделен дял, мащабирането е тривиално• Балансиране на натоварването между всички звена - уеб сървърите, приложните сървъри и базата данни

• http://www.loudthinking.com/arc/000479.html• Кеширането е отлично поддържано

Page 31: Quick and Clean with Ruby on Rails

• За Ruby все още низовете са прости последователности от байтове

• Затова винаги указвайте кодиране в отговора на приложението

• $KCODE=’UTF8’• Ограничена поддръжка на UTF-8 в регулярни изрази и сравнения

• Операциите върху низове няма да работят правилно

\320\224\320\276\320\261\321\212\321\200 \320\262\320\265\321\207\320\265\321Добър вечер, приятелю млад, добре дошъл във България!

Page 32: Quick and Clean with Ruby on Rails

• Rails 1.2 ще поддържа операции върху многобайтови низове (length, capitalize, truncate и пр.)

• "уникод".chars.length• => 6• "уникод".length• => 12• "уникод".chars.capitalize.to_s• => "Уникод"

Добър вечер, приятелю млад, добре дошъл във България!

Page 33: Quick and Clean with Ruby on Rails

Интернационализация

• Не се поддържа в ядрото на Rails...

• ...но има няколко приставки

国際化Internationalisierung

Page 34: Quick and Clean with Ruby on Rails

Интернационализация• Ruby-GetText за кода

• използва инфраструктурата на gettext• .po файловете може да се превеждат от не-програмисти• rake задачи за извличане и обновяване на низовете,

компилиране на .po в .mo

• превод на метаданните (таблици и колони)• работи дори когато няма превод

• показват се низовете от езика по подразбиране

• лесна употреба по време на разработка• _("Остават ви #{minutes} минути до срещата")

Page 35: Quick and Clean with Ruby on Rails

Интернационализация• Globalize за съдържанието• ... и още няколко приставки

• подробно сравнение на http://wiki.rubyonrails.com/rails/pages/InternationalizationComparison

Page 36: Quick and Clean with Ruby on Rails

Предимства• Мощен език• Силна интеграция на тестването• Автоматизация на задачите• Конвенция пред конфигурация• Лесно разширяване и промяна• Мащабируемост• Голяма общност

Page 37: Quick and Clean with Ruby on Rails

Недостатъци• Ruby:

• слаба поддръжка на Уникод • бавен е - няма виртуална машина

• В кода се промъква SQL• Все още не е зряла платформа

• няма гаранция, че собствените ви разширения ще работят без промяна с бъдещи версии на Rails

Page 38: Quick and Clean with Ruby on Rails

Възможности• Ruby:

• най-сетне да се сдобие с виртуална машина• освен разработването на собствена се работи по пускането му

върху JVM и .NET

• поддръжка на Уникод• Rails:

• API за разширяване• Работа с не-SQL хранилища на данни

Page 39: Quick and Clean with Ruby on Rails

• Субсидиите на пътния транспорт правят железниците нерентабилни

• Seaside - фреймуърк на Smalltalk • http://seaside.st

• Django, TurboGears - Python• http://djangoproject.com/• http://turbogears.org/

• PHP заплашва да изяде Rails на закуска

Заплахи

Page 40: Quick and Clean with Ruby on Rails

Среди за разработка• Любимият ви текстов редактор (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

Page 41: Quick and Clean with Ruby on Rails

Ресурси за 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)

Page 42: Quick and Clean with Ruby on Rails

Ресурси за 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/

Page 43: Quick and Clean with Ruby on Rails

Áëàãîäàр

ÿ

çà

âíèìàíèåòî!