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) public class Duck implements Bird { void walk() { } void quack() { } } public void foo(duck duck) { duck.walk(); duck.quack(); } DUCK TYPING (RUBY) class Duck < Bird def walk end 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
<html>... <?php $connection = mysql_connect($server, $login, $pass); mysql_select_db($database); $result = mysql_fetch_array( SELECT * FROM users WHERE id=$id ); mysql_close($connection);?> <body> <ul class= user > <li><?php echo $result[0].name?></li> <li><?php echo $result[0].email?></li> </ul> </body> </html>
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 end 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
<html>... <body> <ul class= user > <li><%= @user.name() %></li> <li><%= @user.email() %></li> </ul> </body> </html>
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 end it shouldn t allow a user without name to be saved" do user = User.new(:name => nil, :email => jan@novak.cz ) user.save.should be_false 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