Marek Osvald 2011 http://fi.muni.cz/~xosvald/pv219/rails.pdf
1994-5, Rasmus Lerdorf
momentálně ve verzi 5.3.5, chystá se verze 6
není nikde kompletně definován → pouze jediný interpret, napsán v C (pod Windows navíc pouze 32bitový)
„Based on my limited experience [...] all the PHP code I’ve seen in that experience has been messy, unmaintainable crap. Spaghetti SQL wrapped in spaghetti PHP wrapped in spaghetti HTML, replicated in slightly-varying form in dozens of places.“ – Tim Bray (Google)
Hlavní argumenty proti PHP
podivné licence (různě licencované moduly) cílená pomalost (Zend Accelerator) 3 zcela nekompatibilní verze (4.3, 4.4, 5.0) špatná podpora znakových sad špatná rekurze nekonzistentní ▪ pojmenování funkcí (spojené × oddělené × camelCase, 2 × to) ▪ pořadí argumentů ▪ návratové hodnoty
(string)"false" == (int)0 → true neobjektové frameworky (CakePHP, Symphony, ...)
1995, まつもとゆきひろ (Yukihiro Matsumoto)
momentálně ve verzi 1.9.2., chystá se verze 2.0
vlastnosti
VHLL - Very High-Level Language skriptovací objektově orientovaný dynamicky typovaný (duck typing) reflektivní automatická správa paměti (garbage collector)
NON-DUCK TYPING (JAVA)
DUCK TYPING (RUBY)
public class Duck implements Bird { void walk() { } void quack() { } }
class Duck < Bird def walk end
public void foo(Duck duck) { duck.walk(); duck.quack(); }
end
def quack end
def foo(duck) duck.walk() duck.quack() end
oficiální interpret (MRI) napsán v C existují i jiné YARV – C (pro verzi 2.0) JRuby – Java Rubinius – C++ IronRuby – C#/.NET MacRuby – Objective-C HotRuby - JavaScript
vychází z Perlu a Pythonu v určitých ohledech se podobá Smalltalku a dalším jazykům
přebírá i některé prvky funkcionálního paradigmatu
plně objektově orientovaný 3.times() do puts(‘Hooray!\n‘) end
balíčkovací nástroj RubyGems (správa knihovních balíků)
www.ruby-lang.org
2004, David Heinemeier Hansson
momentálně ve verzi 3.0.4
framework pro webové aplikace napsaný v Ruby
skládá se z několika základních knihoven (ActiveRecord, ActionPack, ActiveSupport, ActionMailer, ...)
vlastnosti modulární návrh (i základní knihovny lze z frameworku
vynechat) MVC architektura nezávislost na konkrétní DB (drivery) migrace (verzování DB) automatické routování (i bez mod_rewrite) navrženo pro agilní metodiky, obzvláště TDD (Test Driven Development) úzká integrace s verzovacím nástrojem Git
...
MVC Model – datová logika (připojení k DB, SQL,
validace dat, ...) View – prezentační logika (kde v HTML se mají získaná data vypsat) Controller – aplikační logika (co se má načíst z DB, ověření uživatele ze session, ...)
mapování adresy na příslušný controller a akci
http://mujserver.cz/user.php?=1 http://mujserver.cz/user/1
root
:to => „users#index“ match ‚/profile/:id‘ :to => „users#show“
class User < ActiveRecord::Base end User.all() # SELECT * FROM users User.find(1) # SELECT * FROM users WHERE id=1
User.find_by_name(‚Jan Novak‘) # SELECT * FROM users WHERE name=‚Jan Novak‘ User.count() # SELECT count(*) FROM users AS count
class User < ActiveRecord::Base belongs_to :user_group has_many :projects
end
validate :name, :presence => true :uniqueness => true :length => 5..50
pepa = User.find_by_name(‚Josef Novák‘) pepovy_projekty = pepa.projects() pepova_skupina = pepa.user_group()
class UsersController < ApplicationController def index #users/index.html.erb @users = User.all() end def show #users/show.html.erb @user = User.find(params[:id]) end def destroy @user = User.find(params[:id]) @user.destroy() flash[:notice] = „Uzivatel uspesne smazan“ redirect_to ‚index‘ end
end
...
- <%= @user.name() %>
- <%= @user.email() %>
hierarchické skládání layoutů aplikace ▪ /app/views/layouts/application.html.erb controlleru ▪ /app/views/layouts/users.html.erb stránky ▪ /app/views/users/index.html.erb
3 implicitní prostředí development – znovunačítání veškerého kódu
(pomalé, ale dobrá reakce na změny) test – rozšíření debugovacích informací production – pro ostrý provoz, zrychlené
další uživatelsky definovaná prostření
skvělý ladící nástroj
načte celé vaše prostředí z Rails do řádkového interpretu Ruby
velice rychle umožní odhalit problém na aplikační nebo vrstvě
základní testovací jednotka Test::Unit (poslední dobou se od ní spíše ustupuje)
Rspec require ‚user‘ describe „User“ it „shouldn‘t allow a user without name to be saved" do user = User.new(:name => nil, :email => „
[email protected]“) user.save.should be_false end
end
Hal Furton: Ruby – kompendium znalostí pro začátečníky i profesionály (The Ruby Way 2nd Edition)
Zoner Press/Addison Wesley
Steven Holzner: Začínáme programovat v Ruby on Rails (Beginning Ruby on Rails)
Computer Press/Wrox
Ruby
http://www.ruby-lang.org http://www.tryruby.org http://www.root.cz/knihy/ruby-tutorial/ http://rubybrain.com
Rails
http://api.rubyonrails.org http://www.railstutorial.org http://railsforzombies.org/ http://www.railsapi.com