SlideShare uma empresa Scribd logo
1 de 168
Mini Curso
Ruby e Rails   1
2
Objetivo
           3
Agenda

Ruby
   Rails
   JRuby
JRubyOnRails
GlassfishOnRails
   JBossOnRails   4
Ruby é...



“Uma linguagem dinâmica, open source com
foco na simplicidade e na produtividade.Tem
  uma sintaxe elegante de leitura natural e
                 fácil escrita.




             http://www.ruby-lang.org/pt/     5
Instalando Ruby
                                                      (Ubuntu)


$ sudo apt-get install ruby irb
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
Os pacotes extra a seguir serão instalados:
  irb1.8 libreadline-ruby1.8 libruby1.8 ruby1.8
Pacotes sugeridos:
  rdoc1.8 ri1.8 ruby1.8-examples
Os NOVOS pacotes a seguir serão instalados:
  irb irb1.8 libreadline-ruby1.8 libruby1.8 ruby ruby1.8
0 pacotes atualizados, 6 pacotes novos instalados,
(...)
Instalando irb (4.1) ...
Instalando ruby (4.1) ...
Processing triggers for libc6 ...
ldconfig deferred processing now taking
$

                                                                    6
$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

$ irb -v
irb 0.9.5(05/04/13)




                                    Testando a instalação




                                                            7
Linguagem de Script
                como python, perl e bash

$ ls
Code                           Library
Sentilla                       iLiberty+ Payloads
workspace
Desktop                        Music
Snapshots                      liferay
Documents                      Pictures
TryLock.txt                    pgadmin.log

$ echo "viva      a bahia"
viva a bahia

$   i=$(date)
                                           Em BASH, os comandos
$ echo $i                                 podem ser executados no
                                         interpretador (prompt) e o
Sat Mar 21 15:19:37 BRT 2009
                                              resultado obtido
                                               imediatametne...
$                                                                     8
Linguagem de Script
                         .sh
$ cat teste.sh
ls                             ... ou os comandos podem
                                ser todos executados de
echo "viva a bahia"              uma só vez (bash script)
i=$(date)
echo $i
$ bash teste.sh
Code                           Library
Sentilla                       iLiberty+ Payloads
teste.sh
Desktop                        Music
Snapshots                      liferay
Documents                      Pictures
TryLock.txt                    pgadmin.log

viva a bahia

Sat Mar 21 15:25:07 BRT 2009
                                                            9
$
Interpretador Ruby
                       irb

$ irb
irb(main):001:0>   puts "viva a bahia"
viva a bahia
=> nil
irb(main):002:0>   a = 9
=> 9                            Assim como no BASH, os
                               comandos Ruby podem ser
irb(main):003:0>   puts a     executados no interpretador
                              (Ruby) e o resultado obtido
9                                   imediatametne...
=> nil
irb(main):004:0> Time.now
=> Sat Mar 21 15:33:49 -0300 2009
                                                            10
Interpretador Ruby
                      .rb



$ cat teste.rb
puts "viva a bahia"
a = 9
                             ... ou os comandos podem
puts a                        ser todos executados de
puts Time.now                  uma só vez (script ruby)



$ ruby teste.rb
viva a bahia
9
Sat Mar 21 15:40:17 -0300 2009
                                                          11
Ruby é OO

            12
POO
grafo de dependências




                        13
classes




objetos   mensagens




                      14
Urso         ze_colmeia:Urso
raça:String     raça = Grizzly

cor:String      cor = marrom


 grunir()          grunir()

hibernar()        hibernar()



  classe            objeto



                                 15
Ruby é OO
           *tudo* é objeto




$ irb
irb(main):001:0>   1.class
=> Fixnum
irb(main):002:0>   "bahia".class
=> String
irb(main):003:0>   Time.class
=> Class


                                   16
objetos têm métodos
                    (classes também podem ter)

irb(main):006:0>   1.class
=> Fixnum
irb(main):007:0> 1.methods
=> ["%", "odd?", "inspect", "prec_i", "<<", "tap", "div", "&", "clone",
">>", "public_methods", "object_id", "__send__",
"instance_variable_defined?", "equal?", "freeze", "to_sym", "*", "ord",
"+", "extend", "next", "send", "round", "methods", "prec_f", "-",
"even?", "singleton_method_added", "divmod", "hash", "/", "integer?",
"downto", "dup", "to_enum", "instance_variables", "|", "eql?", "size",
"instance_eval", "truncate", "~", "id", "to_i", "singleton_methods",
"modulo", "taint", "zero?", "times", "instance_variable_get", "frozen?",
"enum_for", "display", "instance_of?", "^", "method", "to_a", "+@", "-@",
"quo", "instance_exec", "type", "**", "upto", "to_f", "<", "step",
"protected_methods", "<=>", "between?", "==", "remainder", ">", "===",
"to_int", "nonzero?", "pred", "instance_variable_set", "coerce",
"respond_to?", "kind_of?", "floor", "succ", ">=", "prec", "to_s", "<=",
"fdiv", "class", "private_methods", "=~", "tainted?", "__id__", "abs",
"untaint", "nil?", "chr", "id2name", "is_a?", "ceil", "[]"]
                                                                       17
métodos retornam
                    outros objetos
irb(main):008:0> 1.methods.class
=> Array
irb(main):010:0> 1.methods.methods
=> ["find", "[]=", "inspect", "tap", "<<", "reject!", "flatten", "&", "clone", "push",
"rindex", "take", "__send__", "object_id", "public_methods", "reject", "transpose",
"instance_variable_defined?", "minmax", "choice", "freeze", "equal?", "indexes", "member?",
"each", "delete", "*", "sort", "extend", "partition", "map!", "uniq", "each_cons", "+",
"send", "any?", "each_with_index", "to_ary", "methods", "values_at", "-", "detect", "pack",
"hash", "dup", "take_while", "join", "pop", "replace", "instance_variables", "to_enum",
"reverse", "collect", "clear", "permutation", "slice!", "min_by", "|", "sort_by", "eql?",
"indices", "size", "group_by", "enum_cons", "id", "instance_eval", "at", "one?",
"enum_with_index", "flatten!", "singleton_methods", "find_index", "delete_at", "nitems",
"taint", "empty?", "shift", "drop", "instance_variable_get", "enum_for", "map", "frozen?",
"fill", "display", "instance_of?", "max_by", "uniq!", "combination", "method", "grep", "to_a",
"first", "compact", "instance_exec", "type", "fetch", "none?", "reverse_each",
"protected_methods", "find_all", "<=>", "delete_if", "==", "min", "reverse!", "insert", "===",
"unshift", "drop_while", "instance_variable_set", "sort!", "assoc", "concat", "each_slice",
"inject", "respond_to?", "kind_of?", "minmax_by", "product", "count", "to_s", "class",
"shuffle!", "last", "index", "zip", "private_methods", "=~", "tainted?", "__id__", "select",
"length", "max", "shuffle", "untaint", "nil?", "entries", "each_index", "cycle", "slice",
"reduce", "collect!", "rassoc", "enum_slice", "include?", "is_a?", "[]", "all?", "compact!"]
                                                                                            18
objetos trocam
              mensagens entre si
irb(main):011:0>   1   .methods.sort
=> ["%", "&", "*", "**", "+", "+@", "-", "-@", "/", "<", "<<", "<=",
"<=>", "==", "===", "=~", ">", ">=", ">>", "[]", "^", "__id__",
"__send__", "abs", "between?", "ceil", "chr", "class", "clone",
"coerce", "display", "div", "divmod", "downto", "dup", "enum_for",
"eql?", "equal?", "even?", "extend", "fdiv", "floor", "freeze",
"frozen?", "hash", "id", "id2name", "inspect", "instance_eval",
"instance_exec", "instance_of?", "instance_variable_defined?",
"instance_variable_get", "instance_variable_set",
"instance_variables", "integer?", "is_a?", "kind_of?", "method",
"methods", "modulo", "next", "nil?", "nonzero?", "object_id", "odd?",
"ord", "prec", "prec_f", "prec_i", "pred", "private_methods",
"protected_methods", "public_methods", "quo", "remainder",
"respond_to?", "round", "send", "singleton_method_added",
"singleton_methods", "size", "step", "succ", "taint", "tainted?",
"tap", "times", "to_a", "to_enum", "to_f", "to_i", "to_int", "to_s",
"to_sym", "truncate", "type", "untaint", "upto", "zero?", "|", "~"] 19
então, tudo é objeto e troca
  de mensagem entre eles




   irb(main):034:0> 1+2
   => 3
   irb(main):035:0> 3*5
   => 15


                     repare que +, -, *, / ...
                    são métodos do objeto
                       da classe Fixnum
                                                 20
classes também
                podem ter métodos

irb(main):031:0> 1.class
=> Fixnum
irb(main):032:0> 1.class.methods.sort
=> ["<", "<=", "<=>", "==", "===", "=~", ">", ">=", "__id__", "__send__", "allocate",
"ancestors", "autoload", "autoload?", "class", "class_eval", "class_exec",
"class_variable_defined?", "class_variables", "clone", "const_defined?", "const_get",
"const_missing", "const_set", "constants", "display", "dup", "enum_for", "eql?", "equal?",
"extend", "freeze", "frozen?", "hash", "id", "include?", "included_modules", "induced_from",
"inspect", "instance_eval", "instance_exec", "instance_method", "instance_methods",
"instance_of?", "instance_variable_defined?", "instance_variable_get",
"instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method",
"method_defined?", "methods", "module_eval", "module_exec", "name", "nil?", "object_id",
"private_class_method", "private_instance_methods", "private_method_defined?",
"private_methods", "protected_instance_methods", "protected_method_defined?",
"protected_methods", "public_class_method", "public_instance_methods",
"public_method_defined?", "public_methods", "respond_to?", "send", "singleton_methods",
"superclass", "taint", "tainted?", "tap", "to_a", "to_enum", "to_s", "type", "untaint"]



                                                                                          21
De onde vem isso?
    .class, .methods




      ?                22
Object

           1 é Fixnum,
       que extende Integer,                            Numeric
      que extende Numeric,
       que extende Object.
                                                       Integer

irb(main):026:0>   1.class
=> Fixnum
irb(main):027:0>   1.class.superclass                  Fixnum
=> Integer
irb(main):028:0>   1.class.superclass.superclass
=> Numeric
irb(main):029:0>   1.class.superclass.superclass.superclass
=> Object
irb(main):030:0>   1.class.superclass.superclass.superclass.superclass
=> nil                                                               23
Toda classe Ruby
extende de Object

        Object


          ...


Array   Fixnum   ...

                       24
todos os métodos da classe
               Object estão disponíveis em
                 qualquer objeto Ruby

irb(main):033:0> Object.methods.sort
=> ["<", "<=", "<=>", "==", "===", "=~", ">", ">=", "__id__", "__send__",
"allocate", "ancestors", "autoload", "autoload?", "class", "class_eval",
"class_exec", "class_variable_defined?", "class_variables", "clone",
"const_defined?", "const_get", "const_missing", "const_set", "constants",
"display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?",
"hash", "id", "include?", "included_modules", "inspect", "instance_eval",
"instance_exec", "instance_method", "instance_methods", "instance_of?",
"instance_variable_defined?", "instance_variable_get", "instance_variable_set",
"instance_variables", "is_a?", "kind_of?", "method", "method_defined?",
"methods", "module_eval", "module_exec", "name", "new", "nil?", "object_id",
"private_class_method", "private_instance_methods", "private_method_defined?",
"private_methods", "protected_instance_methods", "protected_method_defined?",
"protected_methods", "public_class_method", "public_instance_methods",
"public_method_defined?", "public_methods", "respond_to?", "send",
"singleton_methods", "superclass", "taint", "tainted?", "tap", "to_a", "to_enum",
"to_s", "type", "untaint"]

                                                                                    25
http://www.ruby-doc.org/   26
@variable


                          def
      while                          until

              Sintaxe Ruby
for
                                     end
                  class
                                do
      <
                attr_accessor
                                             27
Métodos


def     soma a, b
  a+b
end
puts soma 3, 4


                    28
Classe

      numero.rb

class Numero

  # atributos
  # metodos

end
                  29
Classe
                         construtor


class Numero

  def initialize             v
      @valor = v
  end
end
                   irb(main):001:0> require 'numero'
                   => true
                   irb(main):002:0> n = Numero.new     1
                   => #<Numero:0x54ec0 @v=1>


                                                           30
Classe
                        accessors

class Numero

  def initialize v
    @valor = v
  end

end
               irb(main):001:0> require 'numero'
               => true
               irb(main):002:0> n = Numero.new 1
               => #<Numero:0x54e98 @valor=1>
               irb(main):003:0> n.valor
               NoMethodError: undefined method `valor'
               for #<Numero:0x54e98 @valor=1>
                       from (irb):3
                                                         31
Classe
                        accessors
class Numero

  def initialize v
    @valor = v
  end

  attr_accessor :valor
end
               irb(main):002:0> require 'numero'
               => true
               irb(main):003:0> n = Numero.new 1
               => #<Numero:0x500a0 @valor=1>
               irb(main):004:0>   n.valor
               => 1
                                                   32
Classe
                                   herança
                                                 funcionario.rb
            pessoa.rb


 class Pessoa                      class Funcionario       < Pessoa
   def initialize nome                 def initialize n, m
     @nome = nome                         super n
   end                                    @matricula = m
                                       end
   attr_accessor :nome
                                       attr_accessor :matricula
 end
                                   end


require 'pessoa'
require 'funcionario'

p = Pessoa.new 'Alexandre'
puts "A pessoa #{p.nome} foi criada"

f = Funcionario.new 'Ze', '1234'
puts "O funcionario #{f.nome} de matricula #{f.matricula} foi criado"   33
Variáveis
            definição



irb(main):001:0>   a=1
=> 1
irb(main):002:0>   a = 1
=> 1
irb(main):003:0>   puts a
1
=> nil
irb(main):004:0>   a.class
=> Fixnum
irb(main):005:0>   a = "Agilidade"
=> "Agilidade"
irb(main):006:0>   a.class
=> String
irb(main):007:0>   puts a
Agilidade
=> nil
                                     34
Variáveis
        escopo




 x                 variável local


@x           variável de instância


@@x              variável de classe


$x                variável global

                                      35
Números

irb(main):010:0> a = 1
=> 1
irb(main):011:0> a.class
=> Fixnum
irb(main):012:0> a = 1.0
=> 1.0
irb(main):013:0> a.class
=> Float
irb(main):014:0> a = 11111111111111111111111111111111
=> 11111111111111111111111111111111
irb(main):015:0> a.class
=> Bignum




                                                  36
Booleans
Possíveis valores      if a

    a = true        verdadeiro

    a = false          falso

  a = “qqcoisa”     verdadeiro

     a = nil           falso

      a=0           verdadeiro

      a=1           verdadeiro
                                 37
Strings
                   “ ” vs ‘ ’

irb(main):001:0> a = "capoeira"
=> "capoeira"
irb(main):002:0> a.class
=> String
irb(main):003:0> a = 'capoeira'
=> "capoeira"
irb(main):004:0> a.class
=> String
irb(main):005:0> a = 'capoeiranbrasil'
=> "capoeiranbrasil"
irb(main):006:0> puts a
capoeiranbrasil
=> nil
irb(main):007:0> a = "capoeiranbrasil"
=> "capoeiranbrasil"
irb(main):008:0> puts a
capoeira
brasil
=> nil
                                          38
Strings
                expansão de variáveis




irb(main):009:0> b = "o valor de 'a' eh   #{a}"
=> "o valor de 'a' eh capoeiranbrasil"




                                              39
Strings
                      múltiplas linhas


irb(main):010:0> a = <<FIM
irb(main):011:0" aqui comeca
irb(main):012:0" um texto
irb(main):013:0" multilinha
irb(main):014:0" que so vai ter fim
irb(main):015:0" quando eu escrever FIM
irb(main):016:0" no inicio da linha
irb(main):017:0" FIM
=> "aqui comecanum textonmultilinhanque so vai ter fim
nquando eu escrever FIMnno inicio da linhan"
irb(main):018:0> puts a
aqui comeca
um texto
multilinha
que so vai ter fim
quando eu escrever FIM
no inicio da linha
=> nil                                                      40
CONSTANTES


irb(main):019:0> CONSTANTE = "rubyonrails"
=> "rubyonrails"
irb(main):020:0> CONSTANTE = "javaonrails"
(irb):20: warning: already initialized
constant CONSTANTE
=> "javaonrails"




                                             41
Arrays
irb(main):022:0> a = ['arroz',      'feijao', 'abobora']
=> ["arroz", "feijao", "abobora"]
irb(main):023:0> puts a
arroz
feijao
abobora
=> nil
irb(main):024:0> a.class
=> Array
irb(main):025:0>   a[0]
=> "arroz"
irb(main):026:0>   a[1]
=> "feijao"
irb(main):027:0> a[2]
=> "abobora"
irb(main):028:0> a[3]
=> nil
                                                       42
Arrays

irb(main):029:0> a = Array.new
=> []
irb(main):030:0> a.length
=> 0
irb(main):031:0> a[1] = "couve"
=> "couve"
irb(main):032:0> a[0] = "pe-de-porco"
=> "pe-de-porco"
irb(main):033:0> puts a
pe-de-porco
couve
=> nil
irb(main):034:0> a[2] = "mandioca"
=> "mandioca"
irb(main):035:0> a
=> ["pe-de-porco", "couve", "mandioca"]

                                          43
Arrays

irb(main):038:0> puts a
pe-de-porco
couve
mandioca
=> nil
irb(main):039:0> puts a[0]
pe-de-porco
=> nil
irb(main):041:0> a.methods.sort
=> ["&", "*", "+", "-", "<<", "<=>", "==", "===", "=~", "[]",
"[]=", "__id__", "__send__", "all?", "any?", "assoc", "at",
"choice", "class", "clear", "clone", "collect", "collect!",
"combination", "compact", "compact!", "concat", "count", "cycle",
"delete", "delete_at", "delete_if", "detect", "display", "drop",
"drop_while", "dup", "each", "each_cons", "each_index",
"each_slice", "each_with_index", "empty?" (...)
                                                                    44
Hash
                           chave=valor


irb(main):001:0> a = { 1 => "alexandre", 2 => "luciana" }
=> {1=>"alexandre", 2=>"luciana"}
irb(main):002:0> a.class
=> Hash
irb(main):003:0> a = { 1 => "alexandre", "b3" => 802148 }
=> {1=>"alexandre", "b3"=>802148}
irb(main):004:0> a.class
=> Hash
irb(main):005:0> a = Hash.new
=> {}
irb(main):006:0> a[1] = "cavalo"
=> "cavalo"
irb(main):007:0> a[2] = "leao"
=> "leao"
irb(main):008:0> a.class
=> Hash

                                                            45
Blocos


irb(main):001:0> a = [ "xp", "scrum", "lean" ]
=> ["xp", "scrum", "lean"]
irb(main):002:0> a.each do |metodo|
irb(main):003:1*   puts metodo
irb(main):004:1> end
xp
scrum
lean
=> ["xp", "scrum", "lean"]

                                             46
Closure

irb(main):014:0> a = %w(huguinho zezinho luizinho)
=> ["huguinho", "zezinho", "luizinho"]
irb(main):015:0> x = 1
=> 1
irb(main):016:0> a.each_with_index do |elemento, indice|
irb(main):017:1*   puts "x=#{x} e indice=#{indice}"
irb(main):018:1>   x = x + indice
irb(main):019:1> end
x=1 e indice=0
x=1 e indice=1
x=2 e indice=2
=> ["huguinho", "zezinho", "luizinho"]
irb(main):020:0> x
=> 4
                                                       47
if
puts "Digite um numero: "
STDOUT.flush

a    = gets.chomp.to_i

if    a == 1
     puts "voce digitou 'um'"
elsif     a == 2
     puts "voce digitou 'dois'"
else
     puts "voce digitou um valor desconhecido"
end                                              48
case
puts "Digite um numero: "
STDOUT.flush

a   = gets.chomp.to_i

case       a
    when  1
     puts "voce digitou 'um'"
    when 2
     puts "voce digitou 'dois'"
    when 3..9
     puts "voce digitou algo entre tres e nove"
    else
    puts "voce digitou um valor desconhecido"
end                                               49
while
cmd = ""

while ! cmd.eql? "sair"

   puts "Digite um comando: "
   STDOUT.flush
   cmd = gets.chomp

end

puts "Voce saiu."               50
for



for i in 1..10
  puts i
end




                 51
labs




1.   Imprimir números de 1 a 20
2.   Impirimir números ímpares de 1 a 20
3.   Imprimir, em ordem invesa, números ímpares de 1 a 20
4.   Calcular idade a partir da data de nascimento       52
Quer saber mais?

• http://www.ruby-doc.org
• http://www.ruby-lang.org/pt
• http://www.rubyonbr.org
• http://peepcode.com
• http://www.rubylearning.com
• http://www.rubyquiz.com
• http://why.nomedojogo.com
                                53
Rails




http://rubyonrails.org   54
Rails




http://www.rubyonrails.pro.br   55
56
Instalando RubyGems




$ sudo apt-get install rubygems
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
Os pacotes extra a seguir serão instalados:
  libgems-ruby1.8 libopenssl-ruby1.8 rdoc1.8
(...)
Descompactando rubygems (de .../rubygems_0.9.4-4_all.deb) ...
Instalando rdoc1.8 (1.8.6.111-2ubuntu1.2) ...
Instalando libopenssl-ruby1.8 (1.8.6.111-2ubuntu1.2) ...
Instalando libgems-ruby1.8 (0.9.4-4) ...
Instalando rubygems (0.9.4-4) ...
$




                       http://gems.rubyforge.org                         57
$ sudo gem update --system
          Updating RubyGems...
          Attempting remote update of rubygems-update
          Successfully installed rubygems-update-1.3.1
          Updating version of RubyGems to 1.3.1
          Installing RubyGems 1.3.1
          (...)
          RubyGems installed the following executables:
                  /usr/bin/gem1.8

          If `gem` was installed by a previous RubyGems
          installation, you may need
          to remove it by hand.

          RubyGems system software updated
          $


Certifique-se de que a
  última versão do
RubyGem foi instalada
                                                          58
$ sudo apt-get install sqlite3
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
(..)
Baixados 19,9kB em 0s (23,6kB/s)
Selecionando pacote previamente não selecionado sqlite3.
(Lendo banco de dados ... 167352 arquivos e diretórios atualmente
instalados.)
Descompactando sqlite3 (de .../sqlite3_3.4.2-2_i386.deb) ...
Instalando sqlite3 (3.4.2-2) ...




Instalando banco de
    dados sqlite
                                                                    59
$ sudo apt-get install build-essential ruby1.8-dev libsqlite3-dev
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
(...)
Descompactando build-essential (de .../build-essential_11.3ubuntu1_i386.deb) ...
Selecionando pacote previamente não selecionado libsqlite3-dev.
Descompactando libsqlite3-dev (de .../libsqlite3-dev_3.4.2-2_i386.deb) ...
Selecionando pacote previamente não selecionado ruby1.8-dev.
Descompactando ruby1.8-dev (de .../ruby1.8-dev_1.8.6.111-2ubuntu1.2_i386.deb) ...
Instalando build-essential (11.3ubuntu1) ...
Instalando libsqlite3-dev (3.4.2-2) ...
Instalando ruby1.8-dev (1.8.6.111-2ubuntu1.2) ...




 Instalando dependências
necessárias para o acesso
    ao banco via Ruby
                                                                                    60
$ sudo gem install sqlite3-ruby
       Building native extensions. This could take a while...
       Successfully installed sqlite3-ruby-1.2.4
       1 gem installed
       Installing ri documentation for sqlite3-ruby-1.2.4...
       Installing RDoc documentation for sqlite3-ruby-1.2.4...




 Biblioteca do Ruby
para acesso ao banco
   de dados sqlite
                                                                 61
$ sudo gem install rails --version=2.2.2
       Successfully installed activesupport-2.2.2
       Successfully installed activerecord-2.2.2
       Successfully installed actionpack-2.2.2
       Successfully installed actionmailer-2.2.2
       Successfully installed activeresource-2.2.2
       Successfully installed rails-2.2.2
       6 gems installed
       Installing ri documentation for activesupport-2.2.2...
       Installing ri documentation for activerecord-2.2.2...
       Installing ri documentation for actionpack-2.2.2...
       Installing ri documentation for actionmailer-2.2.2...
       Installing ri documentation for activeresource-2.2.2...
       Updating ri class cache with 2176 classes...
       Installing RDoc documentation for activesupport-2.2.2...
       Installing RDoc documentation for activerecord-2.2.2...
       Installing RDoc documentation for actionpack-2.2.2...
       Installing RDoc documentation for actionmailer-2.2.2...
       wInstalling RDoc documentation for activeresource-2.2.2...
Instalando Rails
                                                                    62
Caso o diretório de binários do
                        RubyGem não tiver sido acrescentado
                         ao PATH durante a instalação, faça-o
                                   manualmente.

$ rails -v
O programa 'rails' não está instalado atualmente. Você pode instalá-
lo digitando:
sudo apt-get install rails
-bash: rails: comando não encontrado
$
$
$ echo "export PATH=/var/lib/gems/1.8/bin:$PATH" >> ~/.bash_profile
$ . ~/.bash_profile
$
$ rails -v
Rails 2.2.2


                      Verificando instalação
                             do Rails



                                                                   63
$ rails inscricao_evento
                    create
                    create app/controllers
                    create app/helpers
                    create app/models
                    create app/views/layouts
                    create config/environments
                    create config/initializers
                    create config/locales
                    create db
                    create doc Text
                    create lib
                    (...)
                    create public/javascripts/dragdrop.js
                    create public/javascripts/controls.js
                    create public/javascripts/application.js
                    create doc/README_FOR_APP
                    create log/server.log
                    create log/production.log
                    create log/development.log
                    create log/test.log
Criando app Rails
                                                               64
inscricao_evento $ script/server
         => Booting WEBrick...
         => Rails 2.2.2 application started on http://0.0.0.0:3000
         => Ctrl-C to shutdown server; call with --help for options
         [2009-03-22 15:46:11] INFO WEBrick 1.3.1
         [2009-03-22 15:46:11] INFO ruby 1.8.7 (2008-08-11) [powerpc-darwin8]
         [2009-03-22 15:46:11] INFO WEBrick::HTTPServer#start: pid=2655 port=3000




    Para testar a app,
inicialize o servidor do
   Rails e acesse pelo
        browser...




                                                                               65
Rails é
 MVC
          66
MVC




View   Controller   Model




                            67
MVC




      68
MVC




      69
Rails é
 MVC
          70
Conceitos do Rails


 Scaffold       Routes
  Model          Tasks
Controller       Tests
  View          Scripts
 Helpers       Migration

                           71
Scaffold




C.R.U.D

               72
Scaffold
  Scaffolding is a meta-programming method of building
   database-backed software applications. It is a technique
supported by some model-view-controller frameworks, in which
   the programmer may write a specification that
  describes how the application database may be used.The
compiler uses this specification to generate code that the
 application can use to create, read, update and delete
    database entries, effectively treating the template as a
   "scaffold" on which to build a more powerful application.

             http://en.wikipedia.org/wiki/Scaffold_(programming)   73
Cria cadastro básico (CRUD)
                              para entidade ‘participante’




$ script/generate scaffold participante email:string nome:string
      exists app/models/
      exists app/controllers/
      exists app/helpers/
      create app/views/participantes
      exists app/views/layouts/
      exists test/functional/
      (...)
  dependency model
      exists   app/models/
      exists   test/unit/
      exists   test/fixtures/
      create   app/models/participante.rb
      create   test/unit/participante_test.rb
      create   test/fixtures/participantes.yml
      create   db/migrate
      create   db/migrate/20090318135212_create_participantes.rb
                                                                   74
Scaffold
estrutura de diretórios




                          75
$ rake db:create:all
         (in /home/sea/alegomes/sea/mkt/inscricao_evento)

         $ rake db:migrate
         (in /home/sea/alegomes/sea/mkt/inscricao_evento)
         == CreateParticipantes: migrating
         ============================================
         -- create_table(:participantes)
            -> 0.0045s
         == CreateParticipantes: migrated (0.0050s)
         ===================================

         $



Cria estrutura do
 banco de dados
                                                            76
Cadastro de
participantes pronto

                       77
Por debaixo dos panos...
                           78
Model
app/models




             79
Controller
app/controllers




                  O nome do Controller é
                   usado para acessá-lo




                                       80
Controller
app/controllers




                  81
Controller
app/controllers

 teste_controller.rb




                       82
View
app/views

index.html.erb




                 83
Helper
        app/helpers

teste_helper.rb




                      84
Routes
                                       config/routes.rb




HTTP Request                                                         Controller.action
GET /participantes/alegomes                                                ParticipantesController.show




                              http://guides.rubyonrails.org/routing.html                                  85
Routes
config/routes.rb




                  86
Routes
                                     config/routes.rb

Verbo HTTP           URL               Controller     Action              Descrição

   GET          /participantes        Participantes   index      Lista todos os participantes

                                                                 Apresenta formulario para
   GET       /participantes/new       Participantes    new
                                                                      novo cadastro

  POST          /participantes        Participantes   create     Cria um novo participante

                                                                 Apresenta um participante
   GET         /participantes/1       Participantes    show
                                                                        específico
                                                                Apresenta formulário para edição
   GET       /participantes/1/edit    Participantes    edit      dos dados de um participante

                                                                  Atualiza os dados de um
   PUT         /participantes/1       Participantes   update
                                                                        participante
                                                                   Apaga o registro de um
 DELETE        /participantes/1       Participantes   destroy
                                                                        participante
                                                                                                   87
http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/
                                                                                                88
Tasks
  rake




rake -T


          89
Scripts
                app/script



• about
• dbconsole
• generate
• plugin
• runner
• console
• destroy
• performance
• process
• server
                             90
Tests




http://guides.rubyonrails.org/testing.html   91
Tests
                tipos



Unitários   Funcionais   Integração




                                      92
Tests
           conceitos



Fixtures   Suites      Assertions




                                    93
Tests
          fixtures




test/fixtures/participantes.yml   94
Tests
             unit




test/unit/participante_test.rb   95
Tests
       unit




rake test:units


                  96
Tests
                 functional




test/functional/participantes_controller_test.rb   97
Tests
         functional




rake test:functionals



                      98
Tests
         integration




rake test:integration



        test/integration/*   99
Migration




1.0    1.1        1.2
                        100
Migrations



                Código para
             evolução do banco




                 Código para
             retrocesso do banco

                                   101
Migrations



rake db:migrate




                  102
Revisão


Migration
                      Helpers
  Model
                      Routes
Controller
                       Tasks
  View
                       Tests
 Scaffold

                                103
labs



               Criar aplicação Rails
          Explorar os arquivos gerados
       Criar Scaffold para alguma entidade
               Criar testes unitários
              Criar testes funcionais
                                             104
Quer saber mais?




• http://guides.rubyonrails.org
• http://api.rubyonrails.org



                                  105
JRuby




“   JRuby is an 100% pure-Java implementation of
           the Ruby programming language.




                  http://jruby.codehaus.org        106
JRuby




“    O JRuby é a implementação 100% em puro
    Java da linguagem de programação Ruby. Ou
    seja, permite que você rode seus scripts Ruby
               na máquina virtual Java




                  http://ruby-br.org/?p=179         107
Forma mais fácil
                                                                      de instalação


   $ sudo apt-get install jruby
   Lendo lista de pacotes... Pronto
   Construindo árvore de dependências
   Lendo estado da informação... Pronto
   (...)
   Baixados 3483kB em 10s (334kB/s)
   Selecionando pacote previamente não selecionado jruby1.0.
   (Lendo banco de dados ... 167406 arquivos e diretórios
   atualmente instalados.)
   Descompactando jruby1.0 (de .../jruby1.0_1.0.2-2_all.deb) ...
   Instalando jruby1.0 (1.0.2-2) ...

   $ jruby1.0 -v
   ruby 1.8.5 (2008-01-07 rev 4810) [i386-jruby1.0.2]



Instalação e teste do
        JRuby

                http://wiki.jruby.org/wiki/Getting_Started#QuickStart_with_JRuby        108
$ apt-cache search jruby
            jruby0.9 - 100% pure-Java implementation of Ruby
            jruby1.0 - 100% pure-Java implementation of Ruby




A última versão dos
  repositórios do
 Ubuntu é jruby1.0
     (obsoleta)
                                                               109
$ wget -c http://dist.codehaus.org/jruby/1.1.6/jruby-bin-1.1.6.zip

$ unzip jruby-bin-1.1.6.zip

$ sudo mv jruby-1.1.6/ /opt

$ echo "export PATH=/opt/jruby-1.1.6/bin:$PATH" >> ~/.bash_profile

$ . ~/.bash_profile

$ jruby -v
jruby 1.1.6 (ruby 1.8.6 patchlevel 114) (2008-12-17 rev 8388) [i386-java]



                                                                          Última versão
                                                                       instalada (jruby1.1.6)
                                                                                 o/

                  http://wiki.jruby.org/wiki/Getting_Started#Installing_JRuby                   110
$   jruby -S gem list
                           *** LOCAL GEMS ***

                           rake (0.8.3)
                           rspec (1.1.11)
                           sources (0.0.1)




   Teoricamente, tudo o
 que podia ser executado
     com ruby padrão
(MRI)pode ser executado
  também com o jruby...
                                                   111
...inclusive, uma
                                                  app Rails!



inscricao_evento$ jruby script/server
=> Booting WEBrick
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
/opt/jruby-1.1.6/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/
action_controller/middleware_stack.rb:84 warning: given block not used
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2009-03-19 10:19:21] INFO WEBrick 1.3.1
[2009-03-19 10:19:21] INFO ruby 1.8.6 (2008-12-17) [java]
[2009-03-19 10:19:21] INFO WEBrick::HTTPServer#start: pid=8699
port=3000




                                                                    112
JRubyOnRails




Rails sendo executado sobre
       ambiente JRuby.
                              113
jruby não encontrou a
gem ‘sqlite3’ do banco



     [2009-03-21 07:18:36] INFO WEBrick 1.3.1
     [2009-03-21 07:18:36] INFO ruby 1.8.6 (2009-03-13) [java]
     [2009-03-21 07:18:36] INFO WEBrick::HTTPServer#start: pid=1010 port=3000
     /! FAILSAFE /! Sat Mar 21 07:21:05 -0300 2009
       Status: 500 Internal Server Error
       no such file to load -- sqlite3



                                                                                114
$   jruby -S gem list
*** LOCAL GEMS ***

actionmailer (2.3.2, 2.2.2)
actionpack (2.3.2, 2.2.2)
activerecord (2.3.2, 2.2.2)
activerecord-jdbc-adapter (0.9.1)
activerecord-jdbcsqlite3-adapter (0.9.1)
activeresource (2.3.2, 2.2.2)
activesupport (2.3.2, 2.2.2)
jdbc-sqlite3 (3.6.3.054)
rails (2.3.2, 2.2.2)
rake (0.8.3)
rspec (1.1.11)
sources (0.0.1)

                                Realmente, a gem do
                                 sqlite não é listada

                                                        115
!
atenção às gems

                  116
$ jruby -S gem list      $ gem list                $ sudo gem list           $ sudo jruby -S gem list

*** LOCAL GEMS ***       *** LOCAL GEMS ***        *** LOCAL GEMS ***        *** LOCAL GEMS ***

actionmailer (2.3.2)     actionmailer (2.2.2)      actionmailer (2.2.2)      actionmailer (2.3.2)
actionpack (2.3.2)       actionpack (2.2.2)        actionpack (2.2.2)        actionpack (2.3.2)
activerecord (2.3.2)     activerecord (2.2.2)      activerecord (2.2.2)      activerecord (2.3.2)
activeresource (2.3.2)   activeresource (2.2.2)    activeresource (2.2.2)    activeresource (2.3.2)
activesupport (2.3.2)    activesupport (2.2.2)     activesupport (2.2.2)     activesupport (2.3.2)
rails (2.3.2)            couchrest (0.12.4)        couchrest (0.12.4)        rails (2.3.2)
rake (0.8.3)             extlib (0.9.10)           extlib (0.9.10)           rake (0.8.3)
rspec (1.1.11)           json (1.1.3)              json (1.1.3)              rspec (1.1.11)
sources (0.0.1)          mime-types (1.16)         mime-types (1.16)         sources (0.0.1)
                         mysql (2.7)               mysql (2.7)
                         rails (2.2.2)             rails (2.2.2)
                         rake (0.8.3)              rake (0.8.3)
                         rest-client (0.9)         rest-client (0.9)
                         rspec (1.2.0)             rspec (1.2.0)
                         rubygems-update (1.3.1)   rubygems-update (1.3.1)
                         sqlite3-ruby (1.2.4)      sqlite3-ruby (1.2.4)

 No Mac, as gems do
 jruby são diferentes
   das gems do ruby                                                                               117
$ jruby -S gem list        $ gem list               $ sudo gem list          $ sudo jruby -S gem list

*** LOCAL GEMS ***         *** LOCAL GEMS ***       *** LOCAL GEMS ***       *** LOCAL GEMS ***

actionmailer (2.3.2)       actionmailer (2.3.2)     actionmailer (2.3.2)     actionmailer (2.3.2)
actionpack (2.3.2)         actionpack (2.3.2)       actionpack (2.3.2)       actionpack (2.3.2)
activerecord (2.3.2)       activerecord (2.3.2)     activerecord (2.3.2)     activerecord (2.3.2)
activeresource (2.3.2)     activeresource (2.3.2)   activeresource (2.3.2)   activeresource (2.3.2)
activesupport (2.3.2)      activesupport (2.3.2)    activesupport (2.3.2)    activesupport (2.3.2)
rails (2.3.2)              rails (2.3.2)            rails (2.3.2)            rails (2.3.2)
rake (0.8.3)               rake (0.8.3)             rake (0.8.4)             rake (0.8.3)
rspec (1.1.11)             rspec (1.1.11)           sqlite3-ruby (1.2.4)     rspec (1.1.11)
sources (0.0.1)            sources (0.0.1)                                   sources (0.0.1)




    No Linux, apenas o
 ‘sudo’ do ruby varia as
          gems
                                                                                                  118
Caso o ambiente jruby não
                          esteja com todos os pacotes
                              instalados, instale-os




$   jruby gem install sqlite3-ruby




                                                        119
Tentar instalar o
                                                 sqlite3 no jruby pode
                                                     dar problemas



$ jruby gem install sqlite3-ruby
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Building native extensions. This could take a while...
/opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:7: JRuby does not support
native extensions. Check wiki.jruby.org for alternatives.
(NotImplementedError)
         from /opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:1:in `require'
         from extconf.rb:1
ERROR: Error installing sqlite3-ruby:
         ERROR: Failed to build gem native extension.

/opt/jruby-1.1.6/bin/jruby extconf.rb install sqlite3-ruby



                                                                         120
Adaptador Java para o
                                                                       SQlite




$   gem install activerecord-jdbcsqlite3-adapter
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activerecord-jdbc-adapter-0.9.1
Successfully installed jdbc-sqlite3-3.6.3.054
Successfully installed activerecord-jdbcsqlite3-adapter-0.9.1
3 gems installed
Installing ri documentation for activerecord-jdbc-adapter-0.9.1...
Installing ri documentation for jdbc-sqlite3-3.6.3.054...
Installing ri documentation for activerecord-jdbcsqlite3-adapter-0.9.1...
Installing RDoc documentation for activerecord-jdbc-adapter-0.9.1...
Installing RDoc documentation for jdbc-sqlite3-3.6.3.054...
Installing RDoc documentation for activerecord-jdbcsqlite3-adapter-0.9.1...




                                                                                        121
inscricao_evento$ touch db/development.sqlite3



  inscricao_evento$ vi config/database.yml


     development:
       adapter: sqlite3
       database: db/development.sqlite3
       pool: 5
       timeout: 5000




     development:
       adapter: jdbcsqlite3
       database: db/development.sqlite3
       pool: 5
       timeout: 5000

                                                 122
o/




      123
labs




       124
Deploy de
aplicações Rails
     #railsescala?




                     125
Rails em Produção

• CGI
• FastCGI
• Mongrel
• mod_rails (Phusion Passenger)
• JRuby

                                  126
warbler




          127
128
GlassfishOnRails




“   GlassFish v2 and v3 support JRuby on Rails.
    The JRuby Wiki captures the latest info on
       JRuby on Rails support on GlassFish.




           https://glassfish-scripting.dev.java.net/discover/   129
GlassfishOnRails



A forma mais fácil de se criar
uma app Rails para o Glassfish
 é através da IDE Netbeans.


                                 130
131
132
133
134
135
136
Suporte a
 WAR...


...Warble
requerido
            137
Sem suporte a
   WAR...


  ...Warble
  opcional.
                138
Cliue em
 ‘Finish’ e
aguarde a
criação do
  projeto




              139
140
Execute a
aplicação




            141
142
Aproveitando...


                  143
Nome do model e
 seus atributos




                  144
145
146
147
Para saber mais...




http://www.netbeans.org/download/flash/jruby_on_rails/jruby_on_rails.html




                                                                       148
JBossOnRails




“       Thesis: Rails can run well on JBoss

 Ruby-on-Rails can run well on JBoss AS. Through
  the magic of the JRuby team and Nick Sieger's
JRuby-Rack, running a vanilla Rails app in a servlet
                 container works.



              http://oddthesis.org/theses/jboss-rails   149
150
jboss.org
            151
152
153
Instead of building a Ruby
Application Platform from the
     ground-up, TorqueBox
 leverages the existing ninja-
grade functionality JBoss has
been shipping for years in the
     JBoss Application Server.
                             154
155
http://torquebox.org/documentation/browse/1.0.0.Beta13/installation.html
                                                                       156
http://torquebox.org/documentation/browse/1.0.0.Beta13/rails-support.html   157
Saiba mais!




http://torquebox.org

                       158
Lab?

   159
Últimas palavras...

O mercado esta mudando, e ser
  monolinguístico não é mais
         vantagem...



                                160
Últimas palavras...

   Ruby é uma linguagem
poderosa, elegante e divertida
      de se trabalhar.



                                 161
Últimas palavras...

  Rails conseguiu responder à
 clemência por produtividade
vinda da comunidade Java, com
    estilo e personalidade.


                                162
Últimas palavras...


Ruby e Rails são tecnologias
amicíssimas da escola ágil de
     desenvolvimento.


                                163
Últimas palavras...


JRuby agrega todas as vantagens
consagradas da plataforma Java à
     tecnologia Ruby/Rails.


                                   164
Últimas palavras...

          A equação
     Ruby + Rails + Java
pode colocar o Rails no mercado
  corporativo dominado pela
          cultura Java.

                                  165
Últimas palavras...


 Isso definitivamente pode ser a
próxima grande onda do mercado
de desenvolvimento de software.


                                  166
Últimas palavras...


    Fique atento....

          ;-)


                       167
P&R
blog.seatecnologia.com.br
 alexandre.gomes@seatecnologia.com.br
      twitter.com/alegomes

Mais conteúdo relacionado

Mais procurados

Sintsov advanced exploitation in win32
Sintsov   advanced exploitation in win32Sintsov   advanced exploitation in win32
Sintsov advanced exploitation in win32DefconRussia
 
Rails for PHP Developers
Rails for PHP DevelopersRails for PHP Developers
Rails for PHP DevelopersRobert Dempsey
 
7주 JavaScript 실습
7주 JavaScript 실습7주 JavaScript 실습
7주 JavaScript 실습지수 윤
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラムkwatch
 
100610_blastclustalw
100610_blastclustalw100610_blastclustalw
100610_blastclustalwocha_kaneko
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScriptNone
 
All about Erubis (English)
All about Erubis (English)All about Erubis (English)
All about Erubis (English)kwatch
 
How to Begin Developing Ruby Core
How to Begin Developing Ruby CoreHow to Begin Developing Ruby Core
How to Begin Developing Ruby CoreHiroshi SHIBATA
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Takayuki Shimizukawa
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaPatrick Allaert
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of AtrocityMichael Pirnat
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Rolessartak
 

Mais procurados (20)

node ffi
node ffinode ffi
node ffi
 
Sintsov advanced exploitation in win32
Sintsov   advanced exploitation in win32Sintsov   advanced exploitation in win32
Sintsov advanced exploitation in win32
 
Rails for PHP Developers
Rails for PHP DevelopersRails for PHP Developers
Rails for PHP Developers
 
7주 JavaScript 실습
7주 JavaScript 실습7주 JavaScript 실습
7주 JavaScript 실습
 
ES6 and BEYOND
ES6 and BEYONDES6 and BEYOND
ES6 and BEYOND
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラム
 
Glrb2010 auvi
Glrb2010 auviGlrb2010 auvi
Glrb2010 auvi
 
Floggy-M3DD-2009-01-21
Floggy-M3DD-2009-01-21Floggy-M3DD-2009-01-21
Floggy-M3DD-2009-01-21
 
100610_blastclustalw
100610_blastclustalw100610_blastclustalw
100610_blastclustalw
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
All about Erubis (English)
All about Erubis (English)All about Erubis (English)
All about Erubis (English)
 
How to Begin Developing Ruby Core
How to Begin Developing Ruby CoreHow to Begin Developing Ruby Core
How to Begin Developing Ruby Core
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 Verona
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of Atrocity
 
Coffee Script
Coffee ScriptCoffee Script
Coffee Script
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Roles
 
Txjs
TxjsTxjs
Txjs
 
There and Back Again
There and Back AgainThere and Back Again
There and Back Again
 
How to write Ruby extensions with Crystal
How to write Ruby extensions with CrystalHow to write Ruby extensions with Crystal
How to write Ruby extensions with Crystal
 

Destaque

Loomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleLoomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleSEA Tecnologia
 
Loomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionLoomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionSEA Tecnologia
 
Loomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionLoomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionSEA Tecnologia
 
Ruby no tucupi e Rails com farinha
Ruby no tucupi e Rails com farinhaRuby no tucupi e Rails com farinha
Ruby no tucupi e Rails com farinhas4nx
 
Motivação
MotivaçãoMotivação
Motivaçãos4nx
 
Mais humano que exato
Mais humano que exatoMais humano que exato
Mais humano que exatos4nx
 
Empreendendo com Software Livre
Empreendendo com Software LivreEmpreendendo com Software Livre
Empreendendo com Software Livres4nx
 
Introdução a Linguagem Ruby
Introdução a Linguagem RubyIntrodução a Linguagem Ruby
Introdução a Linguagem RubyDuda Dornelles
 
Ruby - praticamente falando
Ruby - praticamente falandoRuby - praticamente falando
Ruby - praticamente falandos4nx
 
Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?SEA Tecnologia
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyDiego Rubin
 
Ruby, Simples e Expressivo
Ruby, Simples e ExpressivoRuby, Simples e Expressivo
Ruby, Simples e ExpressivoRodrigo Martins
 
Revista Venus Cuba (revista cubana de variedades femeninas)
Revista Venus Cuba  (revista cubana de variedades femeninas)Revista Venus Cuba  (revista cubana de variedades femeninas)
Revista Venus Cuba (revista cubana de variedades femeninas)Etres Publi
 

Destaque (15)

Loomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleLoomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of People
 
Loomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionLoomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new Discussion
 
Loomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionLoomio how to Series - Working on a Discussion
Loomio how to Series - Working on a Discussion
 
Ruby no tucupi e Rails com farinha
Ruby no tucupi e Rails com farinhaRuby no tucupi e Rails com farinha
Ruby no tucupi e Rails com farinha
 
Motivação
MotivaçãoMotivação
Motivação
 
Mais humano que exato
Mais humano que exatoMais humano que exato
Mais humano que exato
 
Ruby
RubyRuby
Ruby
 
Empreendendo com Software Livre
Empreendendo com Software LivreEmpreendendo com Software Livre
Empreendendo com Software Livre
 
Introdução a Linguagem Ruby
Introdução a Linguagem RubyIntrodução a Linguagem Ruby
Introdução a Linguagem Ruby
 
Ruby - praticamente falando
Ruby - praticamente falandoRuby - praticamente falando
Ruby - praticamente falando
 
Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação Ruby
 
A Linguagem Ruby
A Linguagem RubyA Linguagem Ruby
A Linguagem Ruby
 
Ruby, Simples e Expressivo
Ruby, Simples e ExpressivoRuby, Simples e Expressivo
Ruby, Simples e Expressivo
 
Revista Venus Cuba (revista cubana de variedades femeninas)
Revista Venus Cuba  (revista cubana de variedades femeninas)Revista Venus Cuba  (revista cubana de variedades femeninas)
Revista Venus Cuba (revista cubana de variedades femeninas)
 

Semelhante a Minicurso Ruby e Rails

Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Henry S
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby CoreHiroshi SHIBATA
 
Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technologyppparthpatel123
 
Erubis徹底解説
Erubis徹底解説Erubis徹底解説
Erubis徹底解説kwatch
 
The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes BackBurke Libbey
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python ProgrammersVsevolod Dyomkin
 
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...RootedCON
 
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]RootedCON
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Mario Camou Riveroll
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyNick Sieger
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersGiovanni924
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Hiroki Mizuno
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011Nick Sieger
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHiroshi SHIBATA
 
مقایسه و بررسی چهارچوب ریلز
مقایسه و بررسی چهارچوب ریلزمقایسه و بررسی چهارچوب ریلز
مقایسه و بررسی چهارچوب ریلزrailsbootcamp
 

Semelhante a Minicurso Ruby e Rails (20)

Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2Code for Startup MVP (Ruby on Rails) Session 2
Code for Startup MVP (Ruby on Rails) Session 2
 
Ruby 2.0
Ruby 2.0Ruby 2.0
Ruby 2.0
 
55 New Features in Java 7
55 New Features in Java 755 New Features in Java 7
55 New Features in Java 7
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
 
Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technology
 
Erubis徹底解説
Erubis徹底解説Erubis徹底解説
Erubis徹底解説
 
Metaprogramming in Ruby
Metaprogramming in RubyMetaprogramming in Ruby
Metaprogramming in Ruby
 
The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python Programmers
 
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
 
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
Sergi Álvarez & Roi Martín - Radare2 Preview [RootedCON 2010]
 
Lies, Damn Lies, and Benchmarks
Lies, Damn Lies, and BenchmarksLies, Damn Lies, and Benchmarks
Lies, Damn Lies, and Benchmarks
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRuby
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammers
 
Introduction to Ruby
Introduction to RubyIntroduction to Ruby
Introduction to Ruby
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
مقایسه و بررسی چهارچوب ریلز
مقایسه و بررسی چهارچوب ریلزمقایسه و بررسی چهارچوب ریلز
مقایسه و بررسی چهارچوب ریلز
 

Mais de SEA Tecnologia

O curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonO curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonSEA Tecnologia
 
Contratos de desenvolvimento de software para governo blue pill or red pill?
Contratos de desenvolvimento de software para governo  blue pill or red pill?Contratos de desenvolvimento de software para governo  blue pill or red pill?
Contratos de desenvolvimento de software para governo blue pill or red pill?SEA Tecnologia
 
Os benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalOs benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalSEA Tecnologia
 
A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.SEA Tecnologia
 
Open data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreOpen data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreSEA Tecnologia
 
Agilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioAgilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioSEA Tecnologia
 
Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6SEA Tecnologia
 
Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010SEA Tecnologia
 
Sem tesão não há solução
Sem tesão não há soluçãoSem tesão não há solução
Sem tesão não há soluçãoSEA Tecnologia
 
Empreendimentos em Rede
Empreendimentos em RedeEmpreendimentos em Rede
Empreendimentos em RedeSEA Tecnologia
 
Pra você, desenvolver software é atividade intelectual?
Pra você, desenvolver software é atividade intelectual?Pra você, desenvolver software é atividade intelectual?
Pra você, desenvolver software é atividade intelectual?SEA Tecnologia
 
Jopr Plugin Development
Jopr Plugin DevelopmentJopr Plugin Development
Jopr Plugin DevelopmentSEA Tecnologia
 

Mais de SEA Tecnologia (20)

O curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonO curioso caso de Náutilus Button
O curioso caso de Náutilus Button
 
Contratos de desenvolvimento de software para governo blue pill or red pill?
Contratos de desenvolvimento de software para governo  blue pill or red pill?Contratos de desenvolvimento de software para governo  blue pill or red pill?
Contratos de desenvolvimento de software para governo blue pill or red pill?
 
#Fail
#Fail#Fail
#Fail
 
Agilidade no Governo
Agilidade no GovernoAgilidade no Governo
Agilidade no Governo
 
Os benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalOs benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digital
 
A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.
 
Lean Startup
Lean StartupLean Startup
Lean Startup
 
Open Data
Open DataOpen Data
Open Data
 
Open data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreOpen data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software Livre
 
Agilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioAgilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de Intracontágio
 
Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6
 
Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010
 
Sem tesão não há solução
Sem tesão não há soluçãoSem tesão não há solução
Sem tesão não há solução
 
Empreendimentos em Rede
Empreendimentos em RedeEmpreendimentos em Rede
Empreendimentos em Rede
 
Java Profiling Tools
Java Profiling ToolsJava Profiling Tools
Java Profiling Tools
 
Misc Monitoring Tools
Misc Monitoring ToolsMisc Monitoring Tools
Misc Monitoring Tools
 
Cozinha
CozinhaCozinha
Cozinha
 
Pra você, desenvolver software é atividade intelectual?
Pra você, desenvolver software é atividade intelectual?Pra você, desenvolver software é atividade intelectual?
Pra você, desenvolver software é atividade intelectual?
 
Jopr Plugin Development
Jopr Plugin DevelopmentJopr Plugin Development
Jopr Plugin Development
 
JMX Management Tools
JMX Management ToolsJMX Management Tools
JMX Management Tools
 

Último

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 

Último (20)

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 

Minicurso Ruby e Rails

  • 2. 2
  • 4. Agenda Ruby Rails JRuby JRubyOnRails GlassfishOnRails JBossOnRails 4
  • 5. Ruby é... “Uma linguagem dinâmica, open source com foco na simplicidade e na produtividade.Tem uma sintaxe elegante de leitura natural e fácil escrita. http://www.ruby-lang.org/pt/ 5
  • 6. Instalando Ruby (Ubuntu) $ sudo apt-get install ruby irb Lendo lista de pacotes... Pronto Construindo árvore de dependências Lendo estado da informação... Pronto Os pacotes extra a seguir serão instalados: irb1.8 libreadline-ruby1.8 libruby1.8 ruby1.8 Pacotes sugeridos: rdoc1.8 ri1.8 ruby1.8-examples Os NOVOS pacotes a seguir serão instalados: irb irb1.8 libreadline-ruby1.8 libruby1.8 ruby ruby1.8 0 pacotes atualizados, 6 pacotes novos instalados, (...) Instalando irb (4.1) ... Instalando ruby (4.1) ... Processing triggers for libc6 ... ldconfig deferred processing now taking $ 6
  • 7. $ ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux] $ irb -v irb 0.9.5(05/04/13) Testando a instalação 7
  • 8. Linguagem de Script como python, perl e bash $ ls Code Library Sentilla iLiberty+ Payloads workspace Desktop Music Snapshots liferay Documents Pictures TryLock.txt pgadmin.log $ echo "viva a bahia" viva a bahia $ i=$(date) Em BASH, os comandos $ echo $i podem ser executados no interpretador (prompt) e o Sat Mar 21 15:19:37 BRT 2009 resultado obtido imediatametne... $ 8
  • 9. Linguagem de Script .sh $ cat teste.sh ls ... ou os comandos podem ser todos executados de echo "viva a bahia" uma só vez (bash script) i=$(date) echo $i $ bash teste.sh Code Library Sentilla iLiberty+ Payloads teste.sh Desktop Music Snapshots liferay Documents Pictures TryLock.txt pgadmin.log viva a bahia Sat Mar 21 15:25:07 BRT 2009 9 $
  • 10. Interpretador Ruby irb $ irb irb(main):001:0> puts "viva a bahia" viva a bahia => nil irb(main):002:0> a = 9 => 9 Assim como no BASH, os comandos Ruby podem ser irb(main):003:0> puts a executados no interpretador (Ruby) e o resultado obtido 9 imediatametne... => nil irb(main):004:0> Time.now => Sat Mar 21 15:33:49 -0300 2009 10
  • 11. Interpretador Ruby .rb $ cat teste.rb puts "viva a bahia" a = 9 ... ou os comandos podem puts a ser todos executados de puts Time.now uma só vez (script ruby) $ ruby teste.rb viva a bahia 9 Sat Mar 21 15:40:17 -0300 2009 11
  • 14. classes objetos mensagens 14
  • 15. Urso ze_colmeia:Urso raça:String raça = Grizzly cor:String cor = marrom grunir() grunir() hibernar() hibernar() classe objeto 15
  • 16. Ruby é OO *tudo* é objeto $ irb irb(main):001:0> 1.class => Fixnum irb(main):002:0> "bahia".class => String irb(main):003:0> Time.class => Class 16
  • 17. objetos têm métodos (classes também podem ter) irb(main):006:0> 1.class => Fixnum irb(main):007:0> 1.methods => ["%", "odd?", "inspect", "prec_i", "<<", "tap", "div", "&", "clone", ">>", "public_methods", "object_id", "__send__", "instance_variable_defined?", "equal?", "freeze", "to_sym", "*", "ord", "+", "extend", "next", "send", "round", "methods", "prec_f", "-", "even?", "singleton_method_added", "divmod", "hash", "/", "integer?", "downto", "dup", "to_enum", "instance_variables", "|", "eql?", "size", "instance_eval", "truncate", "~", "id", "to_i", "singleton_methods", "modulo", "taint", "zero?", "times", "instance_variable_get", "frozen?", "enum_for", "display", "instance_of?", "^", "method", "to_a", "+@", "-@", "quo", "instance_exec", "type", "**", "upto", "to_f", "<", "step", "protected_methods", "<=>", "between?", "==", "remainder", ">", "===", "to_int", "nonzero?", "pred", "instance_variable_set", "coerce", "respond_to?", "kind_of?", "floor", "succ", ">=", "prec", "to_s", "<=", "fdiv", "class", "private_methods", "=~", "tainted?", "__id__", "abs", "untaint", "nil?", "chr", "id2name", "is_a?", "ceil", "[]"] 17
  • 18. métodos retornam outros objetos irb(main):008:0> 1.methods.class => Array irb(main):010:0> 1.methods.methods => ["find", "[]=", "inspect", "tap", "<<", "reject!", "flatten", "&", "clone", "push", "rindex", "take", "__send__", "object_id", "public_methods", "reject", "transpose", "instance_variable_defined?", "minmax", "choice", "freeze", "equal?", "indexes", "member?", "each", "delete", "*", "sort", "extend", "partition", "map!", "uniq", "each_cons", "+", "send", "any?", "each_with_index", "to_ary", "methods", "values_at", "-", "detect", "pack", "hash", "dup", "take_while", "join", "pop", "replace", "instance_variables", "to_enum", "reverse", "collect", "clear", "permutation", "slice!", "min_by", "|", "sort_by", "eql?", "indices", "size", "group_by", "enum_cons", "id", "instance_eval", "at", "one?", "enum_with_index", "flatten!", "singleton_methods", "find_index", "delete_at", "nitems", "taint", "empty?", "shift", "drop", "instance_variable_get", "enum_for", "map", "frozen?", "fill", "display", "instance_of?", "max_by", "uniq!", "combination", "method", "grep", "to_a", "first", "compact", "instance_exec", "type", "fetch", "none?", "reverse_each", "protected_methods", "find_all", "<=>", "delete_if", "==", "min", "reverse!", "insert", "===", "unshift", "drop_while", "instance_variable_set", "sort!", "assoc", "concat", "each_slice", "inject", "respond_to?", "kind_of?", "minmax_by", "product", "count", "to_s", "class", "shuffle!", "last", "index", "zip", "private_methods", "=~", "tainted?", "__id__", "select", "length", "max", "shuffle", "untaint", "nil?", "entries", "each_index", "cycle", "slice", "reduce", "collect!", "rassoc", "enum_slice", "include?", "is_a?", "[]", "all?", "compact!"] 18
  • 19. objetos trocam mensagens entre si irb(main):011:0> 1 .methods.sort => ["%", "&", "*", "**", "+", "+@", "-", "-@", "/", "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>", "[]", "^", "__id__", "__send__", "abs", "between?", "ceil", "chr", "class", "clone", "coerce", "display", "div", "divmod", "downto", "dup", "enum_for", "eql?", "equal?", "even?", "extend", "fdiv", "floor", "freeze", "frozen?", "hash", "id", "id2name", "inspect", "instance_eval", "instance_exec", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "integer?", "is_a?", "kind_of?", "method", "methods", "modulo", "next", "nil?", "nonzero?", "object_id", "odd?", "ord", "prec", "prec_f", "prec_i", "pred", "private_methods", "protected_methods", "public_methods", "quo", "remainder", "respond_to?", "round", "send", "singleton_method_added", "singleton_methods", "size", "step", "succ", "taint", "tainted?", "tap", "times", "to_a", "to_enum", "to_f", "to_i", "to_int", "to_s", "to_sym", "truncate", "type", "untaint", "upto", "zero?", "|", "~"] 19
  • 20. então, tudo é objeto e troca de mensagem entre eles irb(main):034:0> 1+2 => 3 irb(main):035:0> 3*5 => 15 repare que +, -, *, / ... são métodos do objeto da classe Fixnum 20
  • 21. classes também podem ter métodos irb(main):031:0> 1.class => Fixnum irb(main):032:0> 1.class.methods.sort => ["<", "<=", "<=>", "==", "===", "=~", ">", ">=", "__id__", "__send__", "allocate", "ancestors", "autoload", "autoload?", "class", "class_eval", "class_exec", "class_variable_defined?", "class_variables", "clone", "const_defined?", "const_get", "const_missing", "const_set", "constants", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "include?", "included_modules", "induced_from", "inspect", "instance_eval", "instance_exec", "instance_method", "instance_methods", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "method_defined?", "methods", "module_eval", "module_exec", "name", "nil?", "object_id", "private_class_method", "private_instance_methods", "private_method_defined?", "private_methods", "protected_instance_methods", "protected_method_defined?", "protected_methods", "public_class_method", "public_instance_methods", "public_method_defined?", "public_methods", "respond_to?", "send", "singleton_methods", "superclass", "taint", "tainted?", "tap", "to_a", "to_enum", "to_s", "type", "untaint"] 21
  • 22. De onde vem isso? .class, .methods ? 22
  • 23. Object 1 é Fixnum, que extende Integer, Numeric que extende Numeric, que extende Object. Integer irb(main):026:0> 1.class => Fixnum irb(main):027:0> 1.class.superclass Fixnum => Integer irb(main):028:0> 1.class.superclass.superclass => Numeric irb(main):029:0> 1.class.superclass.superclass.superclass => Object irb(main):030:0> 1.class.superclass.superclass.superclass.superclass => nil 23
  • 24. Toda classe Ruby extende de Object Object ... Array Fixnum ... 24
  • 25. todos os métodos da classe Object estão disponíveis em qualquer objeto Ruby irb(main):033:0> Object.methods.sort => ["<", "<=", "<=>", "==", "===", "=~", ">", ">=", "__id__", "__send__", "allocate", "ancestors", "autoload", "autoload?", "class", "class_eval", "class_exec", "class_variable_defined?", "class_variables", "clone", "const_defined?", "const_get", "const_missing", "const_set", "constants", "display", "dup", "enum_for", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "include?", "included_modules", "inspect", "instance_eval", "instance_exec", "instance_method", "instance_methods", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "method_defined?", "methods", "module_eval", "module_exec", "name", "new", "nil?", "object_id", "private_class_method", "private_instance_methods", "private_method_defined?", "private_methods", "protected_instance_methods", "protected_method_defined?", "protected_methods", "public_class_method", "public_instance_methods", "public_method_defined?", "public_methods", "respond_to?", "send", "singleton_methods", "superclass", "taint", "tainted?", "tap", "to_a", "to_enum", "to_s", "type", "untaint"] 25
  • 27. @variable def while until Sintaxe Ruby for end class do < attr_accessor 27
  • 28. Métodos def soma a, b a+b end puts soma 3, 4 28
  • 29. Classe numero.rb class Numero # atributos # metodos end 29
  • 30. Classe construtor class Numero def initialize v @valor = v end end irb(main):001:0> require 'numero' => true irb(main):002:0> n = Numero.new 1 => #<Numero:0x54ec0 @v=1> 30
  • 31. Classe accessors class Numero def initialize v @valor = v end end irb(main):001:0> require 'numero' => true irb(main):002:0> n = Numero.new 1 => #<Numero:0x54e98 @valor=1> irb(main):003:0> n.valor NoMethodError: undefined method `valor' for #<Numero:0x54e98 @valor=1> from (irb):3 31
  • 32. Classe accessors class Numero def initialize v @valor = v end attr_accessor :valor end irb(main):002:0> require 'numero' => true irb(main):003:0> n = Numero.new 1 => #<Numero:0x500a0 @valor=1> irb(main):004:0> n.valor => 1 32
  • 33. Classe herança funcionario.rb pessoa.rb class Pessoa class Funcionario < Pessoa def initialize nome def initialize n, m @nome = nome super n end @matricula = m end attr_accessor :nome attr_accessor :matricula end end require 'pessoa' require 'funcionario' p = Pessoa.new 'Alexandre' puts "A pessoa #{p.nome} foi criada" f = Funcionario.new 'Ze', '1234' puts "O funcionario #{f.nome} de matricula #{f.matricula} foi criado" 33
  • 34. Variáveis definição irb(main):001:0> a=1 => 1 irb(main):002:0> a = 1 => 1 irb(main):003:0> puts a 1 => nil irb(main):004:0> a.class => Fixnum irb(main):005:0> a = "Agilidade" => "Agilidade" irb(main):006:0> a.class => String irb(main):007:0> puts a Agilidade => nil 34
  • 35. Variáveis escopo x variável local @x variável de instância @@x variável de classe $x variável global 35
  • 36. Números irb(main):010:0> a = 1 => 1 irb(main):011:0> a.class => Fixnum irb(main):012:0> a = 1.0 => 1.0 irb(main):013:0> a.class => Float irb(main):014:0> a = 11111111111111111111111111111111 => 11111111111111111111111111111111 irb(main):015:0> a.class => Bignum 36
  • 37. Booleans Possíveis valores if a a = true verdadeiro a = false falso a = “qqcoisa” verdadeiro a = nil falso a=0 verdadeiro a=1 verdadeiro 37
  • 38. Strings “ ” vs ‘ ’ irb(main):001:0> a = "capoeira" => "capoeira" irb(main):002:0> a.class => String irb(main):003:0> a = 'capoeira' => "capoeira" irb(main):004:0> a.class => String irb(main):005:0> a = 'capoeiranbrasil' => "capoeiranbrasil" irb(main):006:0> puts a capoeiranbrasil => nil irb(main):007:0> a = "capoeiranbrasil" => "capoeiranbrasil" irb(main):008:0> puts a capoeira brasil => nil 38
  • 39. Strings expansão de variáveis irb(main):009:0> b = "o valor de 'a' eh #{a}" => "o valor de 'a' eh capoeiranbrasil" 39
  • 40. Strings múltiplas linhas irb(main):010:0> a = <<FIM irb(main):011:0" aqui comeca irb(main):012:0" um texto irb(main):013:0" multilinha irb(main):014:0" que so vai ter fim irb(main):015:0" quando eu escrever FIM irb(main):016:0" no inicio da linha irb(main):017:0" FIM => "aqui comecanum textonmultilinhanque so vai ter fim nquando eu escrever FIMnno inicio da linhan" irb(main):018:0> puts a aqui comeca um texto multilinha que so vai ter fim quando eu escrever FIM no inicio da linha => nil 40
  • 41. CONSTANTES irb(main):019:0> CONSTANTE = "rubyonrails" => "rubyonrails" irb(main):020:0> CONSTANTE = "javaonrails" (irb):20: warning: already initialized constant CONSTANTE => "javaonrails" 41
  • 42. Arrays irb(main):022:0> a = ['arroz', 'feijao', 'abobora'] => ["arroz", "feijao", "abobora"] irb(main):023:0> puts a arroz feijao abobora => nil irb(main):024:0> a.class => Array irb(main):025:0> a[0] => "arroz" irb(main):026:0> a[1] => "feijao" irb(main):027:0> a[2] => "abobora" irb(main):028:0> a[3] => nil 42
  • 43. Arrays irb(main):029:0> a = Array.new => [] irb(main):030:0> a.length => 0 irb(main):031:0> a[1] = "couve" => "couve" irb(main):032:0> a[0] = "pe-de-porco" => "pe-de-porco" irb(main):033:0> puts a pe-de-porco couve => nil irb(main):034:0> a[2] = "mandioca" => "mandioca" irb(main):035:0> a => ["pe-de-porco", "couve", "mandioca"] 43
  • 44. Arrays irb(main):038:0> puts a pe-de-porco couve mandioca => nil irb(main):039:0> puts a[0] pe-de-porco => nil irb(main):041:0> a.methods.sort => ["&", "*", "+", "-", "<<", "<=>", "==", "===", "=~", "[]", "[]=", "__id__", "__send__", "all?", "any?", "assoc", "at", "choice", "class", "clear", "clone", "collect", "collect!", "combination", "compact", "compact!", "concat", "count", "cycle", "delete", "delete_at", "delete_if", "detect", "display", "drop", "drop_while", "dup", "each", "each_cons", "each_index", "each_slice", "each_with_index", "empty?" (...) 44
  • 45. Hash chave=valor irb(main):001:0> a = { 1 => "alexandre", 2 => "luciana" } => {1=>"alexandre", 2=>"luciana"} irb(main):002:0> a.class => Hash irb(main):003:0> a = { 1 => "alexandre", "b3" => 802148 } => {1=>"alexandre", "b3"=>802148} irb(main):004:0> a.class => Hash irb(main):005:0> a = Hash.new => {} irb(main):006:0> a[1] = "cavalo" => "cavalo" irb(main):007:0> a[2] = "leao" => "leao" irb(main):008:0> a.class => Hash 45
  • 46. Blocos irb(main):001:0> a = [ "xp", "scrum", "lean" ] => ["xp", "scrum", "lean"] irb(main):002:0> a.each do |metodo| irb(main):003:1* puts metodo irb(main):004:1> end xp scrum lean => ["xp", "scrum", "lean"] 46
  • 47. Closure irb(main):014:0> a = %w(huguinho zezinho luizinho) => ["huguinho", "zezinho", "luizinho"] irb(main):015:0> x = 1 => 1 irb(main):016:0> a.each_with_index do |elemento, indice| irb(main):017:1* puts "x=#{x} e indice=#{indice}" irb(main):018:1> x = x + indice irb(main):019:1> end x=1 e indice=0 x=1 e indice=1 x=2 e indice=2 => ["huguinho", "zezinho", "luizinho"] irb(main):020:0> x => 4 47
  • 48. if puts "Digite um numero: " STDOUT.flush a = gets.chomp.to_i if a == 1 puts "voce digitou 'um'" elsif a == 2 puts "voce digitou 'dois'" else puts "voce digitou um valor desconhecido" end 48
  • 49. case puts "Digite um numero: " STDOUT.flush a = gets.chomp.to_i case a when 1 puts "voce digitou 'um'" when 2 puts "voce digitou 'dois'" when 3..9 puts "voce digitou algo entre tres e nove" else puts "voce digitou um valor desconhecido" end 49
  • 50. while cmd = "" while ! cmd.eql? "sair" puts "Digite um comando: " STDOUT.flush cmd = gets.chomp end puts "Voce saiu." 50
  • 51. for for i in 1..10 puts i end 51
  • 52. labs 1. Imprimir números de 1 a 20 2. Impirimir números ímpares de 1 a 20 3. Imprimir, em ordem invesa, números ímpares de 1 a 20 4. Calcular idade a partir da data de nascimento 52
  • 53. Quer saber mais? • http://www.ruby-doc.org • http://www.ruby-lang.org/pt • http://www.rubyonbr.org • http://peepcode.com • http://www.rubylearning.com • http://www.rubyquiz.com • http://why.nomedojogo.com 53
  • 56. 56
  • 57. Instalando RubyGems $ sudo apt-get install rubygems Lendo lista de pacotes... Pronto Construindo árvore de dependências Lendo estado da informação... Pronto Os pacotes extra a seguir serão instalados: libgems-ruby1.8 libopenssl-ruby1.8 rdoc1.8 (...) Descompactando rubygems (de .../rubygems_0.9.4-4_all.deb) ... Instalando rdoc1.8 (1.8.6.111-2ubuntu1.2) ... Instalando libopenssl-ruby1.8 (1.8.6.111-2ubuntu1.2) ... Instalando libgems-ruby1.8 (0.9.4-4) ... Instalando rubygems (0.9.4-4) ... $ http://gems.rubyforge.org 57
  • 58. $ sudo gem update --system Updating RubyGems... Attempting remote update of rubygems-update Successfully installed rubygems-update-1.3.1 Updating version of RubyGems to 1.3.1 Installing RubyGems 1.3.1 (...) RubyGems installed the following executables: /usr/bin/gem1.8 If `gem` was installed by a previous RubyGems installation, you may need to remove it by hand. RubyGems system software updated $ Certifique-se de que a última versão do RubyGem foi instalada 58
  • 59. $ sudo apt-get install sqlite3 Lendo lista de pacotes... Pronto Construindo árvore de dependências Lendo estado da informação... Pronto (..) Baixados 19,9kB em 0s (23,6kB/s) Selecionando pacote previamente não selecionado sqlite3. (Lendo banco de dados ... 167352 arquivos e diretórios atualmente instalados.) Descompactando sqlite3 (de .../sqlite3_3.4.2-2_i386.deb) ... Instalando sqlite3 (3.4.2-2) ... Instalando banco de dados sqlite 59
  • 60. $ sudo apt-get install build-essential ruby1.8-dev libsqlite3-dev Lendo lista de pacotes... Pronto Construindo árvore de dependências Lendo estado da informação... Pronto (...) Descompactando build-essential (de .../build-essential_11.3ubuntu1_i386.deb) ... Selecionando pacote previamente não selecionado libsqlite3-dev. Descompactando libsqlite3-dev (de .../libsqlite3-dev_3.4.2-2_i386.deb) ... Selecionando pacote previamente não selecionado ruby1.8-dev. Descompactando ruby1.8-dev (de .../ruby1.8-dev_1.8.6.111-2ubuntu1.2_i386.deb) ... Instalando build-essential (11.3ubuntu1) ... Instalando libsqlite3-dev (3.4.2-2) ... Instalando ruby1.8-dev (1.8.6.111-2ubuntu1.2) ... Instalando dependências necessárias para o acesso ao banco via Ruby 60
  • 61. $ sudo gem install sqlite3-ruby Building native extensions. This could take a while... Successfully installed sqlite3-ruby-1.2.4 1 gem installed Installing ri documentation for sqlite3-ruby-1.2.4... Installing RDoc documentation for sqlite3-ruby-1.2.4... Biblioteca do Ruby para acesso ao banco de dados sqlite 61
  • 62. $ sudo gem install rails --version=2.2.2 Successfully installed activesupport-2.2.2 Successfully installed activerecord-2.2.2 Successfully installed actionpack-2.2.2 Successfully installed actionmailer-2.2.2 Successfully installed activeresource-2.2.2 Successfully installed rails-2.2.2 6 gems installed Installing ri documentation for activesupport-2.2.2... Installing ri documentation for activerecord-2.2.2... Installing ri documentation for actionpack-2.2.2... Installing ri documentation for actionmailer-2.2.2... Installing ri documentation for activeresource-2.2.2... Updating ri class cache with 2176 classes... Installing RDoc documentation for activesupport-2.2.2... Installing RDoc documentation for activerecord-2.2.2... Installing RDoc documentation for actionpack-2.2.2... Installing RDoc documentation for actionmailer-2.2.2... wInstalling RDoc documentation for activeresource-2.2.2... Instalando Rails 62
  • 63. Caso o diretório de binários do RubyGem não tiver sido acrescentado ao PATH durante a instalação, faça-o manualmente. $ rails -v O programa 'rails' não está instalado atualmente. Você pode instalá- lo digitando: sudo apt-get install rails -bash: rails: comando não encontrado $ $ $ echo "export PATH=/var/lib/gems/1.8/bin:$PATH" >> ~/.bash_profile $ . ~/.bash_profile $ $ rails -v Rails 2.2.2 Verificando instalação do Rails 63
  • 64. $ rails inscricao_evento create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create config/initializers create config/locales create db create doc Text create lib (...) create public/javascripts/dragdrop.js create public/javascripts/controls.js create public/javascripts/application.js create doc/README_FOR_APP create log/server.log create log/production.log create log/development.log create log/test.log Criando app Rails 64
  • 65. inscricao_evento $ script/server => Booting WEBrick... => Rails 2.2.2 application started on http://0.0.0.0:3000 => Ctrl-C to shutdown server; call with --help for options [2009-03-22 15:46:11] INFO WEBrick 1.3.1 [2009-03-22 15:46:11] INFO ruby 1.8.7 (2008-08-11) [powerpc-darwin8] [2009-03-22 15:46:11] INFO WEBrick::HTTPServer#start: pid=2655 port=3000 Para testar a app, inicialize o servidor do Rails e acesse pelo browser... 65
  • 67. MVC View Controller Model 67
  • 68. MVC 68
  • 69. MVC 69
  • 71. Conceitos do Rails Scaffold Routes Model Tasks Controller Tests View Scripts Helpers Migration 71
  • 73. Scaffold Scaffolding is a meta-programming method of building database-backed software applications. It is a technique supported by some model-view-controller frameworks, in which the programmer may write a specification that describes how the application database may be used.The compiler uses this specification to generate code that the application can use to create, read, update and delete database entries, effectively treating the template as a "scaffold" on which to build a more powerful application. http://en.wikipedia.org/wiki/Scaffold_(programming) 73
  • 74. Cria cadastro básico (CRUD) para entidade ‘participante’ $ script/generate scaffold participante email:string nome:string exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/participantes exists app/views/layouts/ exists test/functional/ (...) dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/participante.rb create test/unit/participante_test.rb create test/fixtures/participantes.yml create db/migrate create db/migrate/20090318135212_create_participantes.rb 74
  • 76. $ rake db:create:all (in /home/sea/alegomes/sea/mkt/inscricao_evento) $ rake db:migrate (in /home/sea/alegomes/sea/mkt/inscricao_evento) == CreateParticipantes: migrating ============================================ -- create_table(:participantes) -> 0.0045s == CreateParticipantes: migrated (0.0050s) =================================== $ Cria estrutura do banco de dados 76
  • 78. Por debaixo dos panos... 78
  • 80. Controller app/controllers O nome do Controller é usado para acessá-lo 80
  • 84. Helper app/helpers teste_helper.rb 84
  • 85. Routes config/routes.rb HTTP Request Controller.action GET /participantes/alegomes ParticipantesController.show http://guides.rubyonrails.org/routing.html 85
  • 87. Routes config/routes.rb Verbo HTTP URL Controller Action Descrição GET /participantes Participantes index Lista todos os participantes Apresenta formulario para GET /participantes/new Participantes new novo cadastro POST /participantes Participantes create Cria um novo participante Apresenta um participante GET /participantes/1 Participantes show específico Apresenta formulário para edição GET /participantes/1/edit Participantes edit dos dados de um participante Atualiza os dados de um PUT /participantes/1 Participantes update participante Apaga o registro de um DELETE /participantes/1 Participantes destroy participante 87
  • 90. Scripts app/script • about • dbconsole • generate • plugin • runner • console • destroy • performance • process • server 90
  • 92. Tests tipos Unitários Funcionais Integração 92
  • 93. Tests conceitos Fixtures Suites Assertions 93
  • 94. Tests fixtures test/fixtures/participantes.yml 94
  • 95. Tests unit test/unit/participante_test.rb 95
  • 96. Tests unit rake test:units 96
  • 97. Tests functional test/functional/participantes_controller_test.rb 97
  • 98. Tests functional rake test:functionals 98
  • 99. Tests integration rake test:integration test/integration/* 99
  • 100. Migration 1.0 1.1 1.2 100
  • 101. Migrations Código para evolução do banco Código para retrocesso do banco 101
  • 103. Revisão Migration Helpers Model Routes Controller Tasks View Tests Scaffold 103
  • 104. labs Criar aplicação Rails Explorar os arquivos gerados Criar Scaffold para alguma entidade Criar testes unitários Criar testes funcionais 104
  • 105. Quer saber mais? • http://guides.rubyonrails.org • http://api.rubyonrails.org 105
  • 106. JRuby “ JRuby is an 100% pure-Java implementation of the Ruby programming language. http://jruby.codehaus.org 106
  • 107. JRuby “ O JRuby é a implementação 100% em puro Java da linguagem de programação Ruby. Ou seja, permite que você rode seus scripts Ruby na máquina virtual Java http://ruby-br.org/?p=179 107
  • 108. Forma mais fácil de instalação $ sudo apt-get install jruby Lendo lista de pacotes... Pronto Construindo árvore de dependências Lendo estado da informação... Pronto (...) Baixados 3483kB em 10s (334kB/s) Selecionando pacote previamente não selecionado jruby1.0. (Lendo banco de dados ... 167406 arquivos e diretórios atualmente instalados.) Descompactando jruby1.0 (de .../jruby1.0_1.0.2-2_all.deb) ... Instalando jruby1.0 (1.0.2-2) ... $ jruby1.0 -v ruby 1.8.5 (2008-01-07 rev 4810) [i386-jruby1.0.2] Instalação e teste do JRuby http://wiki.jruby.org/wiki/Getting_Started#QuickStart_with_JRuby 108
  • 109. $ apt-cache search jruby jruby0.9 - 100% pure-Java implementation of Ruby jruby1.0 - 100% pure-Java implementation of Ruby A última versão dos repositórios do Ubuntu é jruby1.0 (obsoleta) 109
  • 110. $ wget -c http://dist.codehaus.org/jruby/1.1.6/jruby-bin-1.1.6.zip $ unzip jruby-bin-1.1.6.zip $ sudo mv jruby-1.1.6/ /opt $ echo "export PATH=/opt/jruby-1.1.6/bin:$PATH" >> ~/.bash_profile $ . ~/.bash_profile $ jruby -v jruby 1.1.6 (ruby 1.8.6 patchlevel 114) (2008-12-17 rev 8388) [i386-java] Última versão instalada (jruby1.1.6) o/ http://wiki.jruby.org/wiki/Getting_Started#Installing_JRuby 110
  • 111. $ jruby -S gem list *** LOCAL GEMS *** rake (0.8.3) rspec (1.1.11) sources (0.0.1) Teoricamente, tudo o que podia ser executado com ruby padrão (MRI)pode ser executado também com o jruby... 111
  • 112. ...inclusive, uma app Rails! inscricao_evento$ jruby script/server => Booting WEBrick => Rails 2.3.2 application starting on http://0.0.0.0:3000 JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL /opt/jruby-1.1.6/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/ action_controller/middleware_stack.rb:84 warning: given block not used => Call with -d to detach => Ctrl-C to shutdown server [2009-03-19 10:19:21] INFO WEBrick 1.3.1 [2009-03-19 10:19:21] INFO ruby 1.8.6 (2008-12-17) [java] [2009-03-19 10:19:21] INFO WEBrick::HTTPServer#start: pid=8699 port=3000 112
  • 113. JRubyOnRails Rails sendo executado sobre ambiente JRuby. 113
  • 114. jruby não encontrou a gem ‘sqlite3’ do banco [2009-03-21 07:18:36] INFO WEBrick 1.3.1 [2009-03-21 07:18:36] INFO ruby 1.8.6 (2009-03-13) [java] [2009-03-21 07:18:36] INFO WEBrick::HTTPServer#start: pid=1010 port=3000 /! FAILSAFE /! Sat Mar 21 07:21:05 -0300 2009 Status: 500 Internal Server Error no such file to load -- sqlite3 114
  • 115. $ jruby -S gem list *** LOCAL GEMS *** actionmailer (2.3.2, 2.2.2) actionpack (2.3.2, 2.2.2) activerecord (2.3.2, 2.2.2) activerecord-jdbc-adapter (0.9.1) activerecord-jdbcsqlite3-adapter (0.9.1) activeresource (2.3.2, 2.2.2) activesupport (2.3.2, 2.2.2) jdbc-sqlite3 (3.6.3.054) rails (2.3.2, 2.2.2) rake (0.8.3) rspec (1.1.11) sources (0.0.1) Realmente, a gem do sqlite não é listada 115
  • 117. $ jruby -S gem list $ gem list $ sudo gem list $ sudo jruby -S gem list *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** actionmailer (2.3.2) actionmailer (2.2.2) actionmailer (2.2.2) actionmailer (2.3.2) actionpack (2.3.2) actionpack (2.2.2) actionpack (2.2.2) actionpack (2.3.2) activerecord (2.3.2) activerecord (2.2.2) activerecord (2.2.2) activerecord (2.3.2) activeresource (2.3.2) activeresource (2.2.2) activeresource (2.2.2) activeresource (2.3.2) activesupport (2.3.2) activesupport (2.2.2) activesupport (2.2.2) activesupport (2.3.2) rails (2.3.2) couchrest (0.12.4) couchrest (0.12.4) rails (2.3.2) rake (0.8.3) extlib (0.9.10) extlib (0.9.10) rake (0.8.3) rspec (1.1.11) json (1.1.3) json (1.1.3) rspec (1.1.11) sources (0.0.1) mime-types (1.16) mime-types (1.16) sources (0.0.1) mysql (2.7) mysql (2.7) rails (2.2.2) rails (2.2.2) rake (0.8.3) rake (0.8.3) rest-client (0.9) rest-client (0.9) rspec (1.2.0) rspec (1.2.0) rubygems-update (1.3.1) rubygems-update (1.3.1) sqlite3-ruby (1.2.4) sqlite3-ruby (1.2.4) No Mac, as gems do jruby são diferentes das gems do ruby 117
  • 118. $ jruby -S gem list $ gem list $ sudo gem list $ sudo jruby -S gem list *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** actionmailer (2.3.2) actionmailer (2.3.2) actionmailer (2.3.2) actionmailer (2.3.2) actionpack (2.3.2) actionpack (2.3.2) actionpack (2.3.2) actionpack (2.3.2) activerecord (2.3.2) activerecord (2.3.2) activerecord (2.3.2) activerecord (2.3.2) activeresource (2.3.2) activeresource (2.3.2) activeresource (2.3.2) activeresource (2.3.2) activesupport (2.3.2) activesupport (2.3.2) activesupport (2.3.2) activesupport (2.3.2) rails (2.3.2) rails (2.3.2) rails (2.3.2) rails (2.3.2) rake (0.8.3) rake (0.8.3) rake (0.8.4) rake (0.8.3) rspec (1.1.11) rspec (1.1.11) sqlite3-ruby (1.2.4) rspec (1.1.11) sources (0.0.1) sources (0.0.1) sources (0.0.1) No Linux, apenas o ‘sudo’ do ruby varia as gems 118
  • 119. Caso o ambiente jruby não esteja com todos os pacotes instalados, instale-os $ jruby gem install sqlite3-ruby 119
  • 120. Tentar instalar o sqlite3 no jruby pode dar problemas $ jruby gem install sqlite3-ruby JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL Building native extensions. This could take a while... /opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:7: JRuby does not support native extensions. Check wiki.jruby.org for alternatives. (NotImplementedError) from /opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:1:in `require' from extconf.rb:1 ERROR: Error installing sqlite3-ruby: ERROR: Failed to build gem native extension. /opt/jruby-1.1.6/bin/jruby extconf.rb install sqlite3-ruby 120
  • 121. Adaptador Java para o SQlite $ gem install activerecord-jdbcsqlite3-adapter JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL Successfully installed activerecord-jdbc-adapter-0.9.1 Successfully installed jdbc-sqlite3-3.6.3.054 Successfully installed activerecord-jdbcsqlite3-adapter-0.9.1 3 gems installed Installing ri documentation for activerecord-jdbc-adapter-0.9.1... Installing ri documentation for jdbc-sqlite3-3.6.3.054... Installing ri documentation for activerecord-jdbcsqlite3-adapter-0.9.1... Installing RDoc documentation for activerecord-jdbc-adapter-0.9.1... Installing RDoc documentation for jdbc-sqlite3-3.6.3.054... Installing RDoc documentation for activerecord-jdbcsqlite3-adapter-0.9.1... 121
  • 122. inscricao_evento$ touch db/development.sqlite3 inscricao_evento$ vi config/database.yml development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 development: adapter: jdbcsqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 122
  • 123. o/ 123
  • 124. labs 124
  • 125. Deploy de aplicações Rails #railsescala? 125
  • 126. Rails em Produção • CGI • FastCGI • Mongrel • mod_rails (Phusion Passenger) • JRuby 126
  • 127. warbler 127
  • 128. 128
  • 129. GlassfishOnRails “ GlassFish v2 and v3 support JRuby on Rails. The JRuby Wiki captures the latest info on JRuby on Rails support on GlassFish. https://glassfish-scripting.dev.java.net/discover/ 129
  • 130. GlassfishOnRails A forma mais fácil de se criar uma app Rails para o Glassfish é através da IDE Netbeans. 130
  • 131. 131
  • 132. 132
  • 133. 133
  • 134. 134
  • 135. 135
  • 136. 136
  • 138. Sem suporte a WAR... ...Warble opcional. 138
  • 139. Cliue em ‘Finish’ e aguarde a criação do projeto 139
  • 140. 140
  • 142. 142
  • 144. Nome do model e seus atributos 144
  • 145. 145
  • 146. 146
  • 147. 147
  • 149. JBossOnRails “ Thesis: Rails can run well on JBoss Ruby-on-Rails can run well on JBoss AS. Through the magic of the JRuby team and Nick Sieger's JRuby-Rack, running a vanilla Rails app in a servlet container works. http://oddthesis.org/theses/jboss-rails 149
  • 150. 150
  • 151. jboss.org 151
  • 152. 152
  • 153. 153
  • 154. Instead of building a Ruby Application Platform from the ground-up, TorqueBox leverages the existing ninja- grade functionality JBoss has been shipping for years in the JBoss Application Server. 154
  • 155. 155
  • 159. Lab? 159
  • 160. Últimas palavras... O mercado esta mudando, e ser monolinguístico não é mais vantagem... 160
  • 161. Últimas palavras... Ruby é uma linguagem poderosa, elegante e divertida de se trabalhar. 161
  • 162. Últimas palavras... Rails conseguiu responder à clemência por produtividade vinda da comunidade Java, com estilo e personalidade. 162
  • 163. Últimas palavras... Ruby e Rails são tecnologias amicíssimas da escola ágil de desenvolvimento. 163
  • 164. Últimas palavras... JRuby agrega todas as vantagens consagradas da plataforma Java à tecnologia Ruby/Rails. 164
  • 165. Últimas palavras... A equação Ruby + Rails + Java pode colocar o Rails no mercado corporativo dominado pela cultura Java. 165
  • 166. Últimas palavras... Isso definitivamente pode ser a próxima grande onda do mercado de desenvolvimento de software. 166
  • 167. Últimas palavras... Fique atento.... ;-) 167

Notas do Editor

  1. Se for pra resumir o objetivo da palestra em uma frase, seria: - Quebra de paradigmas. Ideal para curiosos, entusiastas e c&amp;#xE9;ticosdomundojava.
  2. Ruby &amp;#xE9; orientada a objetos.
  3. Uma aplica&amp;#xE7;&amp;#xE3;o OO pode ser vista como um grafo de objetos. Cada aresta do grafo representa a depend&amp;#xEA;ncia de um objeto com outro, sobre a qual mensagens podem ser trocadas.
  4. Os principais conceitos da OOP (e n&amp;#xE3;o os pilares) s&amp;#xE3;o Classe e Objeto. Classes representam categorias de Objetos. Objetos representam abstra&amp;#xE7;&amp;#xF5;es do mundo real. Objetos comunicam entre si atrav&amp;#xE9;s da troca de mensagens.
  5. Classes definem atributos e m&amp;#xE9;todos para seus objetos. Atributos s&amp;#xE3;o caracter&amp;#xED;sticas que distinguem objetos entre si. M&amp;#xE9;todos representam o comportamento esperado de um objeto.
  6. Qualquer entidade utilizada na linguagem Ruby pertence a alguma classe.
  7. 1 &amp;#xE9; inst&amp;#xE2;ncia da classe Fixnum.
  8. O pr&amp;#xF3;prio resultado de &amp;#x201C;1.methods&amp;#x201D; &amp;#xE9; um objeto da classe Array que, por sua vez, tamb&amp;#xE9;m possui seus pr&amp;#xF3;prios m&amp;#xE9;todos...
  9. ...como, por exemplo, o m&amp;#xE9;todo &amp;#x2018;sort&amp;#x2019;, que ordena o Array.
  10. Destaque para o m&amp;#xE9;todo &amp;#x2018;superclass&amp;#x2019; da classe Fixnum. M&amp;#xE9;todos de classe devem ser invocados pela classe e n&amp;#xE3;o por seus objetos: Integer.superclass OK 1.class.superclass OK 1.superclass FAIL
  11. De onde apareceram esses &amp;#x2018;comandos&amp;#x2019; class e methods que temos usado?
  12. Toda classe do Ruby extende da classe Object
  13. Logo, os m&amp;#xE9;todos dispon&amp;#xED;veis na classe Object est&amp;#xE3;o tamb&amp;#xE9;m dispon&amp;#xED;veis em qualquer classe Ruby.
  14. Para r&amp;#xE1;pido acesso &amp;#xE0;s principais classes do Ruby, e seus respectivos m&amp;#xE9;todos, consulte o site ruby-doc.org
  15. Nomes de m&amp;#xE9;todos come&amp;#xE7;am com letra min&amp;#xFA;scula Nomes compostos s&amp;#xE3;o separados por _ (e.g. soma_inteiro e n&amp;#xE3;o somaInteiro) Par&amp;#xEA;nteses s&amp;#xE3;o opcionais. Logo, &amp;#x2018;def soma a, b&amp;#x2019; e &amp;#x2018;def soma (a, b)&amp;#x2019; s&amp;#xE3;o equivalentes ; tamb&amp;#xE9;m s&amp;#xE3;o opcionais ao final de linha O retorno do m&amp;#xE9;doto &amp;#xE9; igual a sua &amp;#xFA;ltima opera&amp;#xE7;&amp;#xE3;o
  16. O padr&amp;#xE3;o do Ruby &amp;#xE9; que classes tenham nomes iniciados por letras mai&amp;#xFA;sculas e estejam em um arquivo com o mesmo nome, iniciado por letra min&amp;#xFA;scula.
  17. Toda classe pode ser instanciada pelo m&amp;#xE9;todo new O m&amp;#xE9;todo new invoca o m&amp;#xE9;todo construtor da classe, se definido. @valor define uma vari&amp;#xE1;vel de inst&amp;#xE2;ncia, conforme veremos a seguir. Vari&amp;#xE1;veis n&amp;#xE3;o precisam ser previamente declaradas e/ou inicializadas.
  18. Apesar de a vari&amp;#xE1;vel de inst&amp;#xE2;ncia @valor existir, ela n&amp;#xE3;o &amp;#xE9; acess&amp;#xED;vel externamente.
  19. attr_accessor cria m&amp;#xE9;todos de acesso (&amp;#x2018;gets&amp;#x2019; e &amp;#x2018;sets&amp;#x2019;) para a vari&amp;#xE1;vel de inst&amp;#xE2;ncia
  20. O m&amp;#xE9;todo super invoca o construtor da classe pai.
  21. Pelo padr&amp;#xE3;o do Ruby, nomes de vari&amp;#xE1;veis devem iniciar com letra min&amp;#xFA;scula Vari&amp;#xE1;veis em Ruby n&amp;#xE3;o s&amp;#xE3;o tipadas Vari&amp;#xE1;veis n&amp;#xE3;o precisam ser inicializadas Por n&amp;#xE3;o serem tipadas, vari&amp;#xE1;veis Ruby podem alterar suas refer&amp;#xEA;ncias para outros tipos de objeto em tempo de execu&amp;#xE7;&amp;#xE3;o.
  22. Local - s&amp;#xF3; &amp;#xE9; vis&amp;#xED;vel no escopo em que foi definida (e.g. m&amp;#xE9;todo, loop, if...) Inst&amp;#xE2;ncia - &amp;#xE9; vis&amp;#xED;vel no escopo do objeto em que foi definida (e.g. &amp;#x201C;alexandre&amp;#x201D;.length) Classe - &amp;#xE9; vis&amp;#xED;vel no escopo da classe em que foi definida (e.g. String.ancestors) Global - vis&amp;#xED;vel em todos os escopos
  23. Existem 3 classes que representam n&amp;#xFA;meros no Ruby: Fixnum, Float e Bignum
  24. Qualquer coisa diferente de nil e false &amp;#xE9; verdadeira.
  25. Strings podem ser declaradas com &amp;#x201C; ou &amp;#x2018; Com &amp;#x201C;, caracteres especiais s&amp;#xE3;o resolvidos
  26. A expans&amp;#xE3;o de vari&amp;#xE1;veis evita a necessidade de concatena&amp;#xE7;&amp;#xE3;o de strings
  27. String com v&amp;#xE1;rias linhas %Q{ } e %q{ } tamb&amp;#xE9;m podem ser usados para defini&amp;#xE7;&amp;#xE3;o de strings multilinhas, respectivamente, com e sem expans&amp;#xE3;o de vari&amp;#xE1;veis
  28. Constantes devem ter todas as letras mai&amp;#xFA;sculas. O Ruby n&amp;#xE3;o proibe que se altere o valor de constantes, mas alerta pois, se &amp;#xE9; constante, &amp;#xE9; constante.
  29. Arrays s&amp;#xE3;o automaticamente criados com o uso de colchetes. Verifique quais s&amp;#xE3;o os m&amp;#xE9;todos de um Array (a.methods)
  30. Arrays tamb&amp;#xE9;m podem ser criados atrav&amp;#xE9;s do m&amp;#xE9;todo construtor new da classe Array A defini&amp;#xE7;&amp;#xE3;o das c&amp;#xE9;lulas do Array pode se dar em qualquer ordem
  31. [] &amp;#xE9; um m&amp;#xE9;todo da classe Array! a[0] -&gt; envio da mensagem [] ao objeto a
  32. Hashes s&amp;#xE3;o cole&amp;#xE7;&amp;#xF5;es de chaves que referenciam valores Em ruby, usa-se o s&amp;#xED;mbolo de chaves ({}) para a cria&amp;#xE7;&amp;#xE3;o de Hashes Chaves e valores n&amp;#xE3;o precisam seguir qualquer padr&amp;#xE3;o de tipagem
  33. Conceito chave do Ruby (e tamb&amp;#xE9;m do Rails) S&amp;#xE3;o delimitados por &amp;#x2018;do ... end&amp;#x2019; ou &amp;#x2018;{ ... }&amp;#x2018; Entendam blocos como trechos de c&amp;#xF3;digo passados por par&amp;#xE2;metro pra algum m&amp;#xE9;todo &amp;#x2018;each&amp;#x2019; &amp;#xE9; um m&amp;#xE9;todo da classe Array que recebe um bloco de c&amp;#xF3;digo como par&amp;#xE2;metro Na implementa&amp;#xE7;&amp;#xE3;o do m&amp;#xE9;todo each, cada elemento do Array &amp;#xE9; repassado como par&amp;#xE2;metro para o bloco de c&amp;#xF3;digo informado, que &amp;#xE9; executado a cada ocorr&amp;#xEA;ncia.
  34. O bloco de c&amp;#xF3;digo passado para o m&amp;#xE9;todo each_with_index do objeto Array faz refer&amp;#xEA;ncia a uma vari&amp;#xE1;vel externa ao bloco. Diz-se que o bloco mant&amp;#xE9;m refer&amp;#xEA;ncia ao seu contexto de origem.
  35. O m&amp;#xE9;todos gets l&amp;#xEA; uma string da entrada padr&amp;#xE3;o O m&amp;#xE9;todo chomp da classe String remove o de seu final O m&amp;#xE9;todo to_i da classe String converte a string em um inteiro
  36. Repare a nota&amp;#xE7;&amp;#xE3;o de intervalos no terceiro when
  37. Imprimir n&amp;#xFA;meros de 1 a 20 Impirimir n&amp;#xFA;meros &amp;#xED;mpares de 1 a 20 Imprimir, em ordem invesa, n&amp;#xFA;meros &amp;#xED;mpares de 1 a 20 Calcular idade a partir da data de nascimento
  38. A diferen&amp;#xE7;a entre usar Java e seus frameworks vs Ruby on Rails - http://patrickespake.wordpress.com/2009/01/29/a-diferenca-entre-usar-java-e-seus-frameworks-vs-ruby-on-rails/
  39. RubyGems &amp;#xE9; uma esp&amp;#xE9;cie de apt-get do Ruby.
  40. SQLite &amp;#xE9; o banco de dados padr&amp;#xE3;o do Rails, mas &amp;#xE9; poss&amp;#xED;vel usar outros, como PostgreSQL, MySQL etc.
  41. Vamos usar a vers&amp;#xE3;o 2.2.2 devido &amp;#xE0; incompatibilidade do JBoss com a &amp;#xFA;ltima vers&amp;#xE3;o, 2.3.2.
  42. No Ubuntu, os bin&amp;#xE1;rios instalados pelo RubyGems s&amp;#xE3;o armazenados em /var/lib/gems/1.8/bin
  43. O Rails implementa o padr&amp;#xE3;o arquitetural MVC, comum em quase todas aplica&amp;#xE7;&amp;#xF5;es Web.
  44. Pelo padr&amp;#xE3;o, o aplicativo &amp;#xE9; dividido em 3 grandes camadas
  45. Cada camada do padr&amp;#xE3;o MVC responde por um conjunto de responsabilidades Model: manuten&amp;#xE7;&amp;#xE3;o dos dados; regras de neg&amp;#xF3;cio; &amp;#xE9; independente da forma em que os dados s&amp;#xE3;o apresentados e da forma em que se d&amp;#xE1; a entrada de instru&amp;#xE7;&amp;#xF5;es. View: apresenta informa&amp;#xE7;&amp;#xF5;es ao usu&amp;#xE1;rio; obt&amp;#xE9;m os dados do Model. Controller: recebe as a&amp;#xE7;&amp;#xF5;es do usu&amp;#xE1;rio comandadas pela View, geralmente na forma de eventos; Traduz os eventos em solicita&amp;#xE7;&amp;#xF5;es de servi&amp;#xE7;os para o Model ou para a View
  46. Lembre-se disso.
  47. Scaffold &amp;#xE9; um cadastro b&amp;#xE1;sico sobre o qual aplica&amp;#xE7;&amp;#xF5;es complexas s&amp;#xE3;o constru&amp;#xED;das
  48. Na verdade, Scaffold &amp;#xE9; uma t&amp;#xE9;cnica de meta-programa&amp;#xE7;&amp;#xE3;o.
  49. Talvez seja preciso atualizar o RubyGems. Ser&amp;#xE1; gerada toda infra-estrutura de um CRUD, com Model, Controller, View etc.
  50. Veremos detalhes dessa estrutura mais adiante.
  51. Tamb&amp;#xE9;m falaremos disso mais adiante.
  52. Mas vamos ver o que realmente se passa nesse c&amp;#xF3;digo gerado.
  53. Toda classe Model do Rails extende ActiveRecord::Base Parte do modelo de entidades do projeto Cont&amp;#xE9;m regras de neg&amp;#xF3;cio e valida&amp;#xE7;&amp;#xF5;es
  54. Recebe dados das Views, coordena a execu&amp;#xE7;&amp;#xE3;o do Model e devolve o resultado a alguma outra View Um Controller pode conter v&amp;#xE1;rios m&amp;#xE9;todos (Actions)
  55. O mais comum &amp;#xE9; o Controller buscar dados no Model.
  56. Para exemplifica&amp;#xE7;&amp;#xE3;o das Views, vamos fazer mais uma altera&amp;#xE7;&amp;#xE3;o no Controller. Por padr&amp;#xE3;o, todo m&amp;#xE9;todo do Controller (action) direciona o fluxo de execu&amp;#xE7;&amp;#xE3;o para uma View de mesmo nome (e.g. index.html.erb) A View chamada far&amp;#xE1; uso da vari&amp;#xE1;vel de inst&amp;#xE2;ncia @agora retornada pela action index do Controller
  57. ERB ~ JSP ~ ASP ~ PHP O valor @agora &amp;#xE9; colocado no contexto pelo Controller do slide anterior. O nome da View est&amp;#xE1; relacionado com o nome da Action que a invoca
  58. Helpers ajudam as Views a serem mais limpas, favorecendo o princ&amp;#xED;pio DRY - don&amp;#x2019;t repeat yourself. Cada Controller tem um Helper associado. O nome do Helper est&amp;#xE1; associado ao nome de seu respectivo Controller
  59. Define qual Controller responder&amp;#xE1; por qual requisi&amp;#xE7;&amp;#xE3;o
  60. Existem v&amp;#xE1;rias formas de se definir routes, mas o mais indicado &amp;#xE9; atrav&amp;#xE9;s da estrat&amp;#xE9;gia REST map.resources cria rotas padr&amp;#xE3;o baseadas em REST para o controlador informado
  61. A simples instru&amp;#xE7;&amp;#xE3;o map.resources :participantes cria 7 rotas.
  62. O Rails implementa o padr&amp;#xE3;o arquitetural MVC, comum em quase todas aplica&amp;#xE7;&amp;#xF5;es Web.
  63. Como o make do Unix. Como o ant do Java. Automatiza a execu&amp;#xE7;&amp;#xE3;o de tarefas repetitivas.
  64. Testes s&amp;#xE3;o premissa b&amp;#xE1;sica do Rails, presente em suas ra&amp;#xED;zes mais profundas.
  65. Existem 3 tipos de testes Unit&amp;#xE1;rios Funcionais Integra&amp;#xE7;&amp;#xE3;o
  66. Fixtures: pr&amp;#xE9;-condi&amp;#xE7;&amp;#xF5;es para execu&amp;#xE7;&amp;#xE3;o de uma suite de teste (e.g. dados no banco) Suites: conjunto de testes executados sob as mesmas Fixtures Assertions: resultados esperados de cada teste da Suite
  67. Migrations t&amp;#xEA;m a ver com evolu&amp;#xE7;&amp;#xE3;o de bancos de dados A cada nova release do software, cria-se c&amp;#xF3;digo para evoluir o banco para esta nova release e tamb&amp;#xE9;m para retroceder o banco para a release anterior, caso necess&amp;#xE1;rio.
  68. Numa aplica&amp;#xE7;&amp;#xE3;o Rails existem v&amp;#xE1;rias Migrations como esta. Cada Migration ajusta o banco conforme evolu&amp;#xE7;&amp;#xE3;o da app (self.up) e possibilita seu retorno ao estado original caso algo d&amp;#xEA; errado na mudan&amp;#xE7;a (seld.down). Na Migration acima, a tabela &amp;#x2018;participantes&amp;#x2019; &amp;#xE9; criada com duas colunas do tipo string (text, varchar, etc): email e nome,
  69. O comando rake db:migrate executa todas as Migrations no banco.
  70. Criar aplica&amp;#xE7;&amp;#xE3;o Rails Explorar os arquivos gerados Criar Scaffold para alguma entidade Criar testes unit&amp;#xE1;rios Criar testes funcionais
  71. A forma mais f&amp;#xE1;cil de instala&amp;#xE7;&amp;#xE3;o do JRuby &amp;#xE9; atrav&amp;#xE9;s de algum gerenciador de pacotes (apt-get, yum, macports...), mas deve-se tomar cuidado com a obsolesc&amp;#xEA;ncia das vers&amp;#xF5;es dispon&amp;#xED;veis.