введение в ror олег андреев
DESCRIPTION
TRANSCRIPT
Цель
В конце дня —
рельсы у всех!
http://rubyonrails.org/down
МотивацияНовые идеи
МотивацияНовые идеи
Больше за меньшее время
МотивацияНовые идеи
Больше за меньшее время
Удовольствие,
радость,
счастье
Rubyязык программирования
Railsфреймворк
Rubyязык программирования
Railsфреймворк
средоточение светлых идей
<Экскурс в историю>
Ruby
Yukihiro «Matz» Matsumoto, 1993
Ruby on Rails
David Heinemeier Hansson, 2004
<Экскурс в историю>
Ruby
Yukihiro «Matz» Matsumoto, 1993
Ruby on Rails
David Heinemeier Hansson, 2004
</Экскурс в историю>
Главное
MVC Model-View-Controller
ORM Object-Relational Mapping
TDD Test-Driven Development
Фокус
меньше кода
меньше препятствий
ваша задача, не чьи-то паттерны
Соглашения
вместо конфигурации
умные умолчания
либеральные ограничения
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager
has_many :milestones
has_and_belongs_to_many :categories
validates_presence_of :name, :description
validates_uniqueness_of :shortcut
end
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager, :class_name => "Person"
has_many :milestones, :dependent => :destroy
has_and_belongs_to_many :categories, :join_table => "categorizations"
validates_presence_of :name, :description
validates_uniqueness_of :shortcut
end
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager, :class_name => "Person"
has_many :milestones, :dependent => :destroy
has_and_belongs_to_many :categories, :join_table => "categorizations"
validates_presence_of :name, :description
validates_uniqueness_of :shortcut
end
Это всё — Руби
Открытые классы
Рефлексия везде
Весь код — исполняемый
Всё — объект
Все выражения возвращают значение
Проблемы решаются
с помощью самого языка
>> "нужен utf-8?"[0..4]
=> "нуЀ"
class String
def [](range)
split(//u)[range].join
end
end
class String
def [](range)
split(//u)[range].join
end
end
>> "нужен utf-8?"[0..4]
=> "нужен"
class String
alias :old_brackets :[]
def [](*args)
case args.first
when Range, Fixnum:
split(//u)[*args].join
when Regexp, String:
old_brackets(args.first)
else:
raise ArgumentError,
"Didn’t expect #{args.first.class}"
end
end
end
~$ gem install activesupport
>> require 'active_support'
>> $KCODE = 'utf8'
>> 'нужен utf-8?'.chars[0..4]
=> 'нужен'
Полный комплект
От Аякса до базы данных
Один язык на все случаи жизни
DSL — бесплатно
transaction do
oleg.withdrawal(5000)
rit2007.deposit(5000)
end
Account.transaction(oleg, rit2007) do
oleg.withdrawal(5000)
rit2007.deposit(5000)
end
def transaction(*objects, &block)
h = trap('TERM') { raise TransactionError, "Transaction aborted" }
...
trap('TERM', h)
end
ActionController::Routing::Routes.draw do |map|
map.start '', :controller => 'pages', :action => 'start'
map.signup 'signup', :controller => 'account', :action => 'new'
map.event 'events/:id', :controller => 'events', :action => 'show'
map.feed 'feed.:format', :controller => 'events', :action => 'feed'
end
ActionController::Routing::Routes.draw do |map|
map.start '', :controller => 'pages', :action => 'start'
map.signup 'signup', :controller => 'account', :action => 'new'
map.event 'events/:id', :controller => 'events', :action => 'show'
map.feed 'feed.:format', :controller => 'events', :action => 'feed'
end
<h2>Подписка</h2>
<%= link_to 'Новости (RSS)', feed_url(:format => 'rss') %>
<%= link_to 'Новости (Atom)', feed_url(:format => 'atom') %>
ActionController::Routing::Routes.draw do |map|
map.start '', :controller => 'pages', :action => 'start'
map.signup 'signup', :controller => 'account', :action => 'new'
map.event 'events/:id', :controller => 'events', :action => 'show'
map.feed 'feed.:format', :controller => 'events', :action => 'feed'
end
<h2>Подписка</h2>
<%= link_to 'Новости (RSS)', feed_url(:format => 'rss') %>
<%= link_to 'Новости (Atom)', feed_url(:format => 'atom') %>
xml.instruct!
xml.rss("version" => "2.0", "xmlns:dc" => "http://...") do
xml.channel do
xml.title "РИТ-2007"
xml.link "http://rit2007.ru"
xml.description "«Российские интернет-технологии 2007»"
xml.ttl 40
for event in @events
xml.item do
xml.title(event.headline)
xml.description(event.description)
xml.pubDate(event.taken_on.to_s(:rfc822))
xml.link(event_url(:id => event))
end
end
end
end
~/conference/app/controllers/
events_controller.rb
class EventsController < ApplicationController
before_filter :authorize, :only => [:edit, :update, :destroy]
~/conference/app/views/events/list.rhtml
<h1>Мероприятия</h1>
<%= render :partial => 'event', :collection => @events %>
~/conference/app/views/events/_event.rhtml
<div id="event_<%= event.id %>">
<h2><%= event.headline %></h2>
<p><%= event.description %></p>
<p>
<%= link_to_remote 'Удалить', :url => destroy_event_url %>
</p>
</div>
~/conference/app/views/events/destroy.rjs
page.visual_effect :fade, "event_#{@event.id}"
http://api.rubyonrails.org
http://prototypejs.org
http://script.aculo.us
Что-то еще?
В коробкеMVC, ActiveRecord,
ЧПУ, AJAX
Миграции
REST API
Штепсели (plugins)
TestUnit
Консоль, сервер, бенчмарки еще великое множество идей…
Штепсели!
HAML & SASS
RSpec BDD
Globalize
UJS4Rails
acts_as_tree
acts_as_taggable
acts_as_versionedetc. etc. etc.
Спасибо!rubyonrails.org/down
Вопросы[email protected]
novemberain.com
Эти слайды вы найдете здесь: http://oleg.subway.net.ru/rit2007