Introdução ao Ruby on Rails




           Introdução ao Ruby on Rails
Introdução ao Ruby on Rails > Palestrante




           Juan Maiz Lulkin Flores da Cunha
                    WWR person/9354
                    vice-campeão mundial de
                    defender of the favicon
Introdução ao Ruby on Rails > História




           História
                    David Heinemeier Hanson (DHH)
                    Martin Fowler
                    37Signals
Introdução ao Ruby on Rails > Ruby on Rails




           Ruby on Rails
                   Ruby
                   Model View Controller
                   Princípios
                   Comunidade
                   And so much more
Introdução ao Ruby on Rails > Ruby on Rails > Ruby




           Ruby
                   Smalltalk
                      elegância conceitual
                   Python
                      facilidade de uso
                   Perl
                      pragmatismo
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Smalltalk




           Smalltalk
                   1 + 1
                       => 2
                   1.+(1)
                       => 2
                   1.send('+',1)
                       => 2
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Python




           Python
                   for 1 in 1..10
                      puts i
                   end
                      1
                      2
                      3
                      4
                      5
                      6
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Perl




           Perl
                   ls = %w{smalltalk python perl}
                       => ["smalltalk", "python", "perl"]
                   ls.map{|l| “Ruby é como #{l}. ” }.join
                       => “Ruby é como smalltalk. Ruby é como
                              python. Ruby é como perl.
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Hello




           Ruby
                   5.times{ p “ybuR olleH”.reverse }
                      "Hello Ruby"
                      "Hello Ruby"
                      "Hello Ruby"
                      "Hello Ruby"
                      "Hello Ruby"
                      => 5
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos




           Ruby
                   Totalmente OO
                   Mixins (toma essa!)
                   Classes “abertas”
                   Blocos
                   Bibliotecas
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos > Totalmente OO




          Totalmente OO
                   42.class
                      => Fixnum
                   Fixnum.class
                      => Class
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos > Mixins (toma essa!)




           Mixins (toma essa!)
                   module Cool
                       def is_cool!
                        “#{self} is cool!”
                       end
                   end
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos > Classes “abertas”




           Classes “abertas”
                   class String
                       include Cool
                   end
                   puts “Ruby”.is_cool!
                      Ruby is cool!
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos > Blocos




           Blocos
                   [16,19,21,15].select{|n| n > 17}
                      => [19,21]
                   [1,2,3].map{|n| n*2 }
                      => [2,4,6]
                   [5,6,7,8].sort_by{ … }
                   File.open('file.txt').each_line{ … }
                   Dir.glob('*.rb').each{ … }
                   Benchmark.measure { ... }
Introdução ao Ruby on Rails > Ruby on Rails > Ruby > Conceitos > Bibliotecas




           Bibliotecas
                   Hpricot + OpenUri
                   Hpricot(open 'http://ab.com').search('a').map{|a| a[:href]}
                   Prawn
                   Prawn::Document.new.text(“Hello PDF”)
                   RedCloth
                   RedCloth.new(“Hello *Textile*”).to_html
                   RMagick
                   Image.read('i.pdf').first.write('i.png'){self.quality = 80}
                   Shoes
                   Shoes.app{ button "Hello Windows" }
                   RubyGame
                   Game.new.when_key_pressed(:q){ exit }
                   Geokit
                   YahooGeocoder.geocode 'Rua Vieira de Casto 262'
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller




           Model View Controller
                   Model
                       dados e lógica de domínio
                   View
                       interface
                   Controller
                       caminhos e distribuição
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model




           Model
                   ActiveRecord
                   Migrações
                   Operações básicas
                   Relações
                   Validações
                   Acts as
                   Named scopes
                   Adicionar métodos
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Migrações




           Migrações
                   class CreateEvents < ActiveRecord::Migration
                      def self.up
                         create_table :events do |t|
                            t.string :name, :null => false
                            t.boolean :active, :default => true
                            t.integer :year, :null => false
                            t.timestamps
                         end
                      end
                   end
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Operações básicas




           Operações básicas
                   Insert
                   Event.create :name => 'RS on Rails',
                                                :year => Date.today.year
                   e = Event.new
                   e.name = 'RS on Rails'
                   e.year = 2009
                   e.save
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Operações básicas




           Operações básicas
                   Select
                   Event.all :conditions => 'active',
                                             :order => 'created_at',
                                             :limit => 10
                   e = Event.first
                   e = Event.find 1
                   e = Event.find_by_name 'RS on Rails'
                   e = Event.find_by_year 2009
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Operações básicas




           Operações básicas
                   Update
                   Event.update_all 'active = true'
                   e = Event.first
                   e.name = 'other name'
                   e.save
                   e.update_attribute :active => false
                   e.toggle! :active
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Operações básicas




           Operações básicas
                   Delete
                   Event.delete_all
                   e = Event.first
                   e.destroy
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Relações




           Relações
                   class Event < ActiveRecord::Base
                       has_many :talks
                   end
                   class Talk < ActiveRecord::Base
                       belongs_to :event
                       has_one :speaker
                   end
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Relações




           Relações
                   rsr = Event.find_by_name('rsrails')
                   talk = rsr.talks.first
                   talk.name
                       => “Introdução ao Ruby on Rails”
                   talk.speaker.name
                       => “Juan Maiz Lulkin”
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Validações




           Validações
                   class Event < ActiveRecord::Base
                      validates_presence_of :name, :year
                      validates_numericality_of :year
                      validates_inclusion_of :year,
                                                          :in => 2009..2099
                      validates_length_of :name,
                                                          :minimum => 4
                      validates_format_of :name,
                                                          :with => /[A-Z]d+/
                   end
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Acts as




           Acts As
                   class Category < ActiveRecord::Base
                       acts_as_tree
                   enb
                   Category.find(10).parent
                   Category.find(20).children
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Acts as




           Acts As
                   class Doc < ActiveRecord::Base
                      acts_as_versioned
                   end
                   doc = Doc.create :name = '1 st name'
                   doc.version
                     => 1

                   doc.update_attribute :name, '2 nd name'
                   doc.version
                     => 2

                   doc.revert_to(1)
                   doc.name
                     => 1 st name
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Named scopes




           Named scopes
                   class Product < ActiveRecord::Base
                     named_scope :top, :order => 'rank desc'
                     named_scope :ten, :limit => 10
                     named_scope :between, lambda{|min,max|
                          {:conditions => [“price between ? and ?”, min, max]}}
                   end
                   Product.between(0,100).top.ten
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Model > Adicionar métodos




           Adicionar métodos
                   class Product < ActiveRecord::Base
                       def +(product)
                        price + product.price
                       end
                   end
                   foo = Product.find(1)
                   bar = Product.find(2)
                   foo + bar
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Controller




           Controller
                    URL: http://seusite.com/events/rsrails


                    class EventsController < ApplicationController
                      def show
                         name = params[:id]
                         @event = Event.find_by_name(name)
                      end
                    end
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > View




           View
                   app/views/events/show.html.haml


                       #content
                       %h1 Palestras
                       %ul
                          - for talk in @event.talks
                            %li= talk.title

                                                * Você está usando HAML, não?
Introdução ao Ruby on Rails > Ruby on Rails > Princípios




           Princípios
                    Convention Over Configuration
                      Se é usado na maior parte dos
                      casos, deve ser o padrão.
                    Don't Repeat Yourself
                       Mixins, plugins, engines, gems...
                    Métodos ágeis
                       BDD, TDD, integração contínua,
                      deployment...
Introdução ao Ruby on Rails > Ruby on Rails > Princípios > CoC




           Convention Over Configuration
                   XML YAML
                   development:
                       adapter: postgresql
                       encoding: unicode
                       database: events_development
                       pool: 5
                       username: event_admin
                       password: *****
Introdução ao Ruby on Rails > Ruby on Rails > Princípios > CoC




           Convention Over Configuration
                   rsrails = Event.find(1)
                       => assume campo “id” na tabela “events”
                   rsrails.talks
                       => assume uma tabela “talks” com um
                      fk “event_id”
                   rsrails.talks.first.speaker
                       => assume campo “speaker_id” em “talks”
                             como fk para tabela “speakers”
Introdução ao Ruby on Rails > Ruby on Rails > Princípios > CoC




           Convention Over Configuration
                   script/generate scaffold Event
                                                                 name:string
                                                                 year:integer
                                                                 active:boolean
Introdução ao Ruby on Rails > Ruby on Rails > Princípios > DRY




           Don't Repeat Yourself
                   active_scaffold
                   link_to login
                   image_tag 'star.png' * hotel.stars
                   render :partial => 'event',
                                               :collection => @events
Introdução ao Ruby on Rails > Ruby on Rails > Princípios > Métodos ágeis




           Métodos ágeis
                   class EventTest < ActiveSupport::TestCase
                      test "creation" do
                         assert Event.create :name => 'rsrails',
                                                                     :year => 2009
                      end
                   end
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Princípios > Métodos ágeis




           Métodos ágeis
                    rake integrate
                    cap deploy
Introdução ao Ruby on Rails > Ruby on Rails > Model View Controller > Princípios > Métodos ágeis




           Métodos ágeis
                    Getting Real
                    http://gettingreal.37signals.com/
Introdução ao Ruby on Rails > Ruby on Rails > Comunidade




          Comunidade
                   Lista rails-br
                   Ruby Inside (.com e .com.br)
                   Working With Rails
Introdução ao Ruby on Rails > Ruby on Rails > And so much more




          And so much more
                   Internacionalização (i18n)
                   Rotas
                   Cache
                   Ajax
                   Background Jobs
                   ...
Introdução ao Ruby on Rails > Fim




           Fim

Introdução ao Ruby on Rails

  • 1.
    Introdução ao Rubyon Rails Introdução ao Ruby on Rails
  • 2.
    Introdução ao Rubyon Rails > Palestrante Juan Maiz Lulkin Flores da Cunha WWR person/9354 vice-campeão mundial de defender of the favicon
  • 3.
    Introdução ao Rubyon Rails > História História David Heinemeier Hanson (DHH) Martin Fowler 37Signals
  • 4.
    Introdução ao Rubyon Rails > Ruby on Rails Ruby on Rails Ruby Model View Controller Princípios Comunidade And so much more
  • 5.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby Ruby Smalltalk elegância conceitual Python facilidade de uso Perl pragmatismo
  • 6.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Smalltalk Smalltalk 1 + 1 => 2 1.+(1) => 2 1.send('+',1) => 2
  • 7.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Python Python for 1 in 1..10 puts i end 1 2 3 4 5 6
  • 8.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Perl Perl ls = %w{smalltalk python perl} => ["smalltalk", "python", "perl"] ls.map{|l| “Ruby é como #{l}. ” }.join => “Ruby é como smalltalk. Ruby é como python. Ruby é como perl.
  • 9.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Hello Ruby 5.times{ p “ybuR olleH”.reverse } "Hello Ruby" "Hello Ruby" "Hello Ruby" "Hello Ruby" "Hello Ruby" => 5
  • 10.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos Ruby Totalmente OO Mixins (toma essa!) Classes “abertas” Blocos Bibliotecas
  • 11.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos > Totalmente OO Totalmente OO 42.class => Fixnum Fixnum.class => Class
  • 12.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos > Mixins (toma essa!) Mixins (toma essa!) module Cool def is_cool! “#{self} is cool!” end end
  • 13.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos > Classes “abertas” Classes “abertas” class String include Cool end puts “Ruby”.is_cool! Ruby is cool!
  • 14.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos > Blocos Blocos [16,19,21,15].select{|n| n > 17} => [19,21] [1,2,3].map{|n| n*2 } => [2,4,6] [5,6,7,8].sort_by{ … } File.open('file.txt').each_line{ … } Dir.glob('*.rb').each{ … } Benchmark.measure { ... }
  • 15.
    Introdução ao Rubyon Rails > Ruby on Rails > Ruby > Conceitos > Bibliotecas Bibliotecas Hpricot + OpenUri Hpricot(open 'http://ab.com').search('a').map{|a| a[:href]} Prawn Prawn::Document.new.text(“Hello PDF”) RedCloth RedCloth.new(“Hello *Textile*”).to_html RMagick Image.read('i.pdf').first.write('i.png'){self.quality = 80} Shoes Shoes.app{ button "Hello Windows" } RubyGame Game.new.when_key_pressed(:q){ exit } Geokit YahooGeocoder.geocode 'Rua Vieira de Casto 262'
  • 16.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller Model View Controller Model dados e lógica de domínio View interface Controller caminhos e distribuição
  • 17.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model Model ActiveRecord Migrações Operações básicas Relações Validações Acts as Named scopes Adicionar métodos
  • 18.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Migrações Migrações class CreateEvents < ActiveRecord::Migration def self.up create_table :events do |t| t.string :name, :null => false t.boolean :active, :default => true t.integer :year, :null => false t.timestamps end end end
  • 19.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Operações básicas Operações básicas Insert Event.create :name => 'RS on Rails', :year => Date.today.year e = Event.new e.name = 'RS on Rails' e.year = 2009 e.save
  • 20.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Operações básicas Operações básicas Select Event.all :conditions => 'active', :order => 'created_at', :limit => 10 e = Event.first e = Event.find 1 e = Event.find_by_name 'RS on Rails' e = Event.find_by_year 2009
  • 21.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Operações básicas Operações básicas Update Event.update_all 'active = true' e = Event.first e.name = 'other name' e.save e.update_attribute :active => false e.toggle! :active
  • 22.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Operações básicas Operações básicas Delete Event.delete_all e = Event.first e.destroy
  • 23.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Relações Relações class Event < ActiveRecord::Base has_many :talks end class Talk < ActiveRecord::Base belongs_to :event has_one :speaker end
  • 24.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Relações Relações rsr = Event.find_by_name('rsrails') talk = rsr.talks.first talk.name => “Introdução ao Ruby on Rails” talk.speaker.name => “Juan Maiz Lulkin”
  • 25.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Validações Validações class Event < ActiveRecord::Base validates_presence_of :name, :year validates_numericality_of :year validates_inclusion_of :year, :in => 2009..2099 validates_length_of :name, :minimum => 4 validates_format_of :name, :with => /[A-Z]d+/ end
  • 26.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Acts as Acts As class Category < ActiveRecord::Base acts_as_tree enb Category.find(10).parent Category.find(20).children
  • 27.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Acts as Acts As class Doc < ActiveRecord::Base acts_as_versioned end doc = Doc.create :name = '1 st name' doc.version => 1 doc.update_attribute :name, '2 nd name' doc.version => 2 doc.revert_to(1) doc.name => 1 st name
  • 28.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Named scopes Named scopes class Product < ActiveRecord::Base named_scope :top, :order => 'rank desc' named_scope :ten, :limit => 10 named_scope :between, lambda{|min,max| {:conditions => [“price between ? and ?”, min, max]}} end Product.between(0,100).top.ten
  • 29.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Model > Adicionar métodos Adicionar métodos class Product < ActiveRecord::Base def +(product) price + product.price end end foo = Product.find(1) bar = Product.find(2) foo + bar
  • 30.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Controller Controller URL: http://seusite.com/events/rsrails class EventsController < ApplicationController def show name = params[:id] @event = Event.find_by_name(name) end end
  • 31.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > View View app/views/events/show.html.haml #content %h1 Palestras %ul - for talk in @event.talks %li= talk.title * Você está usando HAML, não?
  • 32.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios Princípios Convention Over Configuration Se é usado na maior parte dos casos, deve ser o padrão. Don't Repeat Yourself Mixins, plugins, engines, gems... Métodos ágeis BDD, TDD, integração contínua, deployment...
  • 33.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios > CoC Convention Over Configuration XML YAML development: adapter: postgresql encoding: unicode database: events_development pool: 5 username: event_admin password: *****
  • 34.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios > CoC Convention Over Configuration rsrails = Event.find(1) => assume campo “id” na tabela “events” rsrails.talks => assume uma tabela “talks” com um fk “event_id” rsrails.talks.first.speaker => assume campo “speaker_id” em “talks” como fk para tabela “speakers”
  • 35.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios > CoC Convention Over Configuration script/generate scaffold Event name:string year:integer active:boolean
  • 36.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios > DRY Don't Repeat Yourself active_scaffold link_to login image_tag 'star.png' * hotel.stars render :partial => 'event', :collection => @events
  • 37.
    Introdução ao Rubyon Rails > Ruby on Rails > Princípios > Métodos ágeis Métodos ágeis class EventTest < ActiveSupport::TestCase test "creation" do assert Event.create :name => 'rsrails', :year => 2009 end end
  • 38.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Princípios > Métodos ágeis Métodos ágeis rake integrate cap deploy
  • 39.
    Introdução ao Rubyon Rails > Ruby on Rails > Model View Controller > Princípios > Métodos ágeis Métodos ágeis Getting Real http://gettingreal.37signals.com/
  • 40.
    Introdução ao Rubyon Rails > Ruby on Rails > Comunidade Comunidade Lista rails-br Ruby Inside (.com e .com.br) Working With Rails
  • 41.
    Introdução ao Rubyon Rails > Ruby on Rails > And so much more And so much more Internacionalização (i18n) Rotas Cache Ajax Background Jobs ...
  • 42.
    Introdução ao Rubyon Rails > Fim Fim