16. Ruby on Rails, част 1
19 декември 2011
Днес
- За какво ще си говорим? На първо място:
- Програмиране за уеб и удоволствието в това
- Фреймуъркът "Ruby on Rails" — общ поглед, функционалност, компоненти, архитектура, демонстрация
Преди това
въпроси относно метапрограмиране
Какво прави instance_eval
?
instance_eval
променя self
в рамките на един блок
Въпрос 2
Споделете поне три различни начина за дефиниране методи в клас.
def something; end
define_method :something { |args| }
eval()
Въпрос 3
Ако искате да напишете клас-прокси, кой ще бъде родителският ви клас?
BasicObject
- Защо не
Object
?
- В
Object
има твърде много методи, за разлика от BasicObject
Въпрос 4
В Ruby могат ли да се създават анонимни класове и/или модули? Ако да, как?
Разбира се, посредством Class.new { block }
и Module.new { block }
Въпрос 5
Що е то singleton class
на обект? Какво знаете за него?
- За всеки обект при нужда се създава специален клас, наречен singleton class
- Съдържа методите, добавени специално към този обект
- Известен е още като metaclass, eigenclass и собствен клас
Въпрос 6
- 1. Къде се пазят класовите методи? Защо?
- В singleton класа на текущия клас. Защото всеки клас е обект от тип
Class
.
- 2. Ако имаме
class A; end
и class B < A; end
, то какво е B.singleton_class.superclass
?
- Родителският клас на
B.singleton_class
е A.singleton_class
.
Обратно към Rails
Що е то?
- Фреймуърк
- Дава солидна основа за разработка на уеб-приложения
- Спестява ви значително количество хамалогия
- Прави ви по-щастливи уеб-програмисти :)
Защо Rails?
- Защо да ползваме Ruby on Rails? Защо Ruby?
- "Целта на Ruby е да прави програмистите щастливи." — Мацумото Юкихиро
- "Rails is the killer app for Ruby." — Мацумото Юкихиро
- Качество
- Иновативност
- Сигурност и производителност
- Community
Принципи
- Convention over configuration
- DRY
- TDD/BDD
- REST (Representational state transfer)
- Много, удобни DSL-и
- Получавате пълен комплект (дори с включени батерии :)
Възможности
aka "фийчъри"
- Open-source!
- Готови адаптери за работа с бази данни, плюс ORM-та; дори можете да минете без да пишете SQL
- Добре се интегрира в Unix/Linux-среди (command-line управление, Rails console, Rake задачи и т.н.)
- Environments: разграничаване на различните среди, в които работи вашето приложение — режим на разработка (development), по време на изпълнение на тестове (test) или по време на реална работа (production); може да имате и други environments
- Database migrations
- Вградена възможност за I18n (интернационализация и многоезичност)
- Където има нужда от конфигурация, може да ползвате удобния YAML-формат за целта
- Asset Pipeline
- Интеграция на неща като CoffeeScript и SASS
Възможности (2)
- Чиста и консистентна схема за дефиниране на routes на приложението
- Валидации на данните, идващи от форми
- Вградено управление на сигурни сесии (криптирани)
- Full-blown caching — page, action, fragment
- Управление на layout-и (headers & footers)
- Управление на рендериращи формати (.html, .js, .xml и т.н.)
- Множество помощна функционалност за генериране на форми, URL-и и различни HTML-компоненти
- Вградена поддръжка на AJAX-форми и линкове посредством
remote: true
(data-remote="true"
)
- Unobtrusive JavaScript — посредством адаптер, напр. rails.js; може да се ползва и друг
- Много, много други
Кратка история
- Създаден е от небезизвестния (вече) датчанин David Heinemeier Hansson (DHH)
- първият публичен commit на Rails е от ноември 2004 г.
- Rails се е родил като изваден код от съществуващи проекти на фирмата на DHH (37 Signals), който е решавал generic проблеми, възникващи при разработката на уеб-приложения
Версии
- Rails се разпространява под формата на няколко Ruby gem-а, обединени в един общ "meta gem" —
rails
- Следва semantic versioning схемата
- Най-новата версия към момента е в 3.1-клона — 3.1.3
Компоненти
Action Pack
— съставен от Action Controller
, Action Dispatch
и Action View
Action Mailer
— изпращане на мейли по културен начин
Active Model
— валидации, преводи, callback-функции и много други
Active Record
— ORM към релационни бази от типа на PostgreSQL, MySQL, SQLite и т.н.
Active Resource
— CRUD на отдалечени ресурси
Active Support
— разширения на стандартната Ruby библиотека с различни благинки
Railties
— код-лепило между отделните компоненти, документация, guides и прочее
Генериране на изгледи
в HTML или друг формат
- За това е отговорен
ActionView
- Налични са различни renderer-и
- ERB (по подразбиране)
- Haml
- Slim и т.н.
Пример с ERB
<div id="profile">
<div class="left column">
<div id="date"><%= print_date %></div>
<div id="address"><%= current_user.address %></div>
</div>
<div class="right column">
<div id="email"><%= current_user.email %></div>
<div id="bio"><%= current_user.bio %></div>
</div>
</div>
Пример с Haml
#profile
.left.column
#date= print_date
#address= current_user.address
.right.column
#email= current_user.email
#bio= current_user.bio
Пример със Slim
doctype html
html
head
title Slim Core Example
meta name="keywords" content="template language"
body
h1 Markup examples
div id="content" class="example1"
p Nest by indentation