Desenvolvimento Web com
      Ruby on Rails



                   Por Júlio Bêtta
Por que Ruby ???
●
    Linguagem dinâmica
●
    Totalmente Orientado a Objetos
●
    Sintaxe flexível
●
    Cross-plataform
    Ruby(C), jRuby(Java), IronRuby(.NET)
●
    Software Livre
●
    Programadores mais felizes =)
Ruby on Rails
Sobre o Ruby on Rails
●   Framework web implementado na linguagem Ruby
●   Desenvolvimento ágil de aplicações web
●   MVC
●   Utiliza o conceito Convention over Configuration (CoC)
●   E muito mais ...
Ruby on Rails


●
    Principais Banco de Dados Suportados
    ●
        SQlite 3 (padrão)
    ●
        MySQL
    ●
        PostgreSQL
    ●
        Oracle
    ●
        Microsoft SQL Server
Ruby on Rails


●
    Instalação
    ●
        Windows:
        http://railsinstaller.org

    ●
        Linux (Ubuntu):
        https://github.com/juliobetta/RoR/tree/master/installation




           Os exemplos a seguir foram testados apenas em ambiente LINUX.
Sintaxe
Sintaxe
●
     IRB
   Programa iniciado na linha de comando que permite a execução de
  comandos em Ruby com responta em tempo-real.




   
  




       Todos os comandos a seguir podem ser testados utilizando o irb.
Sintaxe
●
     Strings
  
     "eu sou uma string"
     'Ruby ' + 'on Rails'




   
  
Sintaxe
●
    Variáveis
    Não é preciso declarar o tipo:
    nome = "Ruby"
    Porém a tipagem no Ruby é forte:
    versao = 3
    nome   = "Rails " + versao (TYPE ERROR)

    versao = 3
    nome   = "Rails " + versao.to_s
    Podemos avaliar expressões dentro de strings com conversão
    automática:
    versao = 3
    nome   = "Ruby" 
    curso  = "#{nome} on Rails #{versao}"
Sintaxe
●
    Operações básicas
    1 + 2   # adição
    4 – 2   # subtração
    2 * 2   # multiplicação
    6 / 2   # divisão
    15 % 2  # modulo

●
    Operadores
    5 == (2+3) # igualdade
    2 != 3     # inigualdade 
    10 > 13    # maior
    3  <  10   # menor
    5  <= 5    # menor ou igual
    5  >= 5    # maior ou igual
Sintaxe
●
     Controles de fluxo
     Maneira usual:

   idade = 15
   if (idade < 16) then
      puts 'que pariu! Você não deveria estar dirigindo.'
   end
  
 
Sintaxe
●
    Controles de fluxo
    Maneira usual um pouco melhor:

   idade = 15
   if idade < 16
      puts 'Você não deveria estar dirigindo.'
   end
  
 
Sintaxe
●
     Controles de fluxo
     Isso é ótimo:

   idade = 15
   puts 'Você não deveria estar dirigindo.' if idade < 16


  
 
Sintaxe
●
     Controles de fluxo
     Algo diferente:

   idade = 15
   unless idade >= 16
      puts 'Você não deveria estar dirigindo.'
   end

     ou:
  
  idade = 15
  puts 'Você não deveria estar dirigindo.' unless idade >= 16
Sintaxe
●
    Controles de fluxo
    Não me esqueci do else:

   idade = 18
   if idade < 16
      puts 'Você não deveria estar dirigindo.'
  
   else
      puts 'Pode seguir!'
   end
  
 
    Famosos operadores ternários:
    idade = 18
    puts idade >= 16 ? 'Pode seguir!':'Vai pra casa!'
Sintaxe
●
     Controles de fluxo
     Loops

      for i in 1..10   5.times do |n|   5.upto(10) do
         puts i           puts n           puts 'Oi!'
      end              end              end
  

   letras = ['a','b','c','d']
   letras.each do |letra|
      puts letra
  end

     i = 0
     while i < 5
        puts i
        i += 1
     end
Sintaxe
●
    Arrays e Hashes
  Arrays
   objetos   = ['carro','bicicleta','pizza']
   objetos   = %w(teclado mouse livro)
   puts objetos[0]

   Hash
   atributos = {:nome      => 'Yukihiro',
 
                :sobrenome => 'Matsumoto',
                :email     => 'matz@ruby.co.jp'}
   puts atributos[:nome]
Sintaxe
●
    Ruby :symbols
    São cadeias de caracteres usualmente utilizados como identificadores.
    Eles são como strings , porém reusam o mesmo espaço de memória.
    Vejamos:
    "carro".object_id
   => 2953810
   "carro".object_id
   => 2951340

    :carro.object_id
   => 166418
   :carro.object_id
  => 166418
Sintaxe
●
     Métodos (funções)
     def diga_adeus_para(nome, sobrenome)
        "Adeus #{nome} #{sobrenome}..."
     end
  
     puts diga_adeus_para("Yukihiro", "Matsumoto")

  
  Como parênteses neste caso são opcionais, soa mais natural como:

     puts diga_adeus_para "Yukihiro", "Matsumoto"
Sintaxe
●
    Classes
    A maneira mais longa:             … e a mais curta:
    class Pessoa                      class Pessoa
       @nome                             attr_accessor :nome,
       @sobrenome                                      :sobrenome
                                      end
       def nome                                  Define getters e setters
         @nome
       end

       def sobrenome                  class Pessoa
         @sobrenome                      attr_reader :nome,
       end                                           :sobrenome
                                      end
          def nome=(nome)                        Define somente getters
            @nome = nome
          end                         class Pessoa
                                         attr_writer :nome,
          def sobrenome=(sobrenome)                  :sobrenome
            @sobrenome = sobrenome    end
          end
    end                                          Define somente setters
Sintaxe
●
     Classes
     Criar novas instância com o método .new
   matz = Pessoa.new
   matz.nome      = "Yukihiro" 
   matz.sobrenome = "Matsumoto"
   puts matz.nome
   puts matz.sobrenome

  
 
Sintaxe
●
    Classes
    Herança
   class Usuario < Pessoa
      attr_accessor :nome_usuario,
                    :senha
   end

   matz = Usuario.new
   matz.nome         = "Yukihiro" 
   matz.sobrenome    = "Matsumoto"
 
   matz.nome_usuario = "matz"
   matz.senha        = "abc123"
Sintaxe
●
     Classes
     As classes são abertas:
   class Pessoa
     def initialize(nome, sobrenome)
        @nome      = nome
        @sobrenome = sobrenome 
     end

    def to_s
      "#{@nome} #{@sobrenome}"
 
    end
  end

     matz = Pessoa.new "Yukihiro", "Matsumoto"
     puts matz
Mão na massa !!!
Mão na massa


●
    Switter
    ●
        Aplicação similar a uma seção do famoso microblog
    ●
        Exibir usuários e microposts (sweets)

         Entidades
Mão na massa


●
    Switter
    $ rails new switter

     Estrutura de diretórios gerada
     automaticamente
Mão na massa


●
    Switter




              Organiza a aplicação em
                  componentes
Mão na massa


●
    Switter




     Configuração da aplicação   Arquivos estáticos
Mão na massa


●
    Página Inicial
    Criando um Controller:


    No terminal:

    $ rails generate controller paginas inicio
Mão na massa


●
    Página Inicial
    $ rails generate controller paginas inicio

     Arquivos gerados automaticamente
     na pasta app
Mão na massa


●
    Página Inicial
    Criando uma Action no Controller que acabamos de gerar:
    app/views/paginas/inicio.html.erb

    <h2>Seja bem­vindo ao Switter!!!</h2>

    app/controllers/paginas_controller.rb
    class PaginasController < ApplicationController
       def inicio
          render 'paginas/inicio'
       end
    end
Mão na massa


●
    Layout padrão
    ●
        Contém a estrutura HTML da aplicação;
    ●
        A ideia é que as views geradas nos controllers sejam incluídas
        neste arquivo, através do método yield.
    app/views/layouts/application.html.erb
    <!DOCTYPE html>
    <html>
    <head>
      <title>Switter</title>
      <%= stylesheet_link_tag    "application" %>
      <%= javascript_include_tag "application" %>
      <%= csrf_meta_tags %>
    </head>
    <body>
    <%= yield %>
    </body>
    </html>
Mão na massa


●
    Rotas
    Sistema que examina a URL solicitada e determina qual ação deve
    deve ser executada pela aplicação.


    config/routes.rb

    Switter::Application.routes.draw do
       get 'paginas/inicio'
    end
Mão na massa


●
    Inicialização
    Rails já possui um webserver embutido:

    $ rails server
Mão na massa


●
    Scaffolding
    ●
        Criar model, controller e views para criar, exibir, atualizar e
        deletar (CRUD) o recurso que especificarmos
    ●
        Também é responsável por criar as tabelas do banco de dados


    $ rails generate scaffold usuario nome:string 
      email:string

    $ rails generate scaffold micropost
      usuario_id:integer conteudo:string 
Mão na massa


●
    Scaffolding

    Estrutura gerada na pasta app
Mão na massa


●
    Scaffolding
    Rotas geradas
    config/routes.rb
    Switter::Application.routes.draw do
      get 'paginas/inicio'
      resources :usuarios
      resources :microposts
    end
Mão na massa


●
    Migrations




    $ rake db:migrate
Mão na massa


●
    Rake
    ●
        Executar tarefas
    ●
        Funciona como o Make, Ant, etc...
    ●
        Utilizado para gerenciar banco de dados, rodar testes, e o que
        mais for preciso
    ●
        Executar tarefas personalizadas



      $ rake ­­tasks
Mão na massa


●
    Scaffolding
Mão na massa


●
    Scaffolding
Mão na massa


●
    Scaffolding é bom porque...
    ●
        É rapido
    ●
        Mostra como o Rails funciona
    ●
        Usa padrões que usaremos no dia-a-dia
Mão na massa


●
    Scaffolding é ruim porque...
    ●
        O código não é otimizado
    ●
        Pode adicionar mais código do que venhamos precisar
    ●
        É muito simplório (uma tabela, sem possibilidades de gerar
        relacionamentos automaticamente)




         Profissionais da área não utilizam esta técnica em ambiente de produção.
Mão na massa


●
    ActiveRecord
    ●
        Biblioteca ORM que encapsula as tabelas do banco de dados
        como objetos
    ●
        Utiliza o poder do Ruby de gerar código (metaprogramação)
Mão na massa


●
     ActiveRecord Interativo
     Os exemplos a seguir podem ser testados por meio do rails console, que
    pode ser executado de duas maneiras:



     $ rails console


     $ rails console ­­sandbox

     Com o parâmetro sandbox ativado, toda mudança no banco de dados será
    desfeita após a saída do console.


                                  * utilizar o comando exit para sair do console.
Mão na massa


●
    ActiveRecord Interativo
    Criar um usuário:

     matz=Usuario.new({:nome  => 'Yukihiro',
                       :email => 'matz@ruby.co.jp'})
     matz.save

    Selecionar usuário:
     matz = Usuario.where({:nome => 'Yukihiro'})
    Alterar usuário:
     matz.nome = 'Yukihiro Matsumoto'
     matz.save
    Deletar usuário:
     Usuario.find(1).destroy
Mão na massa


●
     Relacionamento
    Como vimos no início, um usuário possui vários microposts e um
    micropost pertence a apenas um usuário.
         Entidades
Mão na massa


●
    Relacionamento
    app/models/usuario.rb

    class Usuario < ActiveRecord::Base
       has_many :microposts
    end


    app/models/micropost.rb

    class Micropost < ActiveRecord::Base
       belongs_to :usuario
    end

    Com isso, é gerado, via metaprogramação, o método usuario na instância da
    classe Micropost e o método microposts na instância da classe Usuario.
Mão na massa


●
    Relacionamento (console)
    Listar todos os microposts de um determinado usuário:
     # seleciona o último usuario inserido no BD
     usuario = Usuario.last
     # e atribui a variavel todos seus microposts
     microposts = usuario.microposts 

    Cria um micropost e o atribui a um usuário:
    matz = Usuario.where :nome => 'Yukihiro Matsumoto'
    micropost = Micropost.new
    micropost.conteudo = 'Eu sou o criador do Ruby!'
    micropost.usuario = matz
    micropost.save
    # imprime Yukihiro Matsumoto
    puts micropost.usuario.nome 
Mão na massa


●
    Relacionamento (views)
    app/views/microposts/index.html.erb gerado pelo scaffold.

    ...
    <tr>
        <td><%= micropost.usuario_id %></td>
        <td><%= micropost.conteudo %></td>
    ...

    app/views/microposts/index.html.erb modificado.

    ...
    <tr>
        <td><%= micropost.usuario.nome %></td>
        <td><%= micropost.conteudo %></td>
    ...
Mão na massa


●
    Relacionamento (views)
Mão na massa


●
    Relacionamento (views)
    app/views/microposts/_form.html.erb gerado pelo scaffold.

    ...
     <div class="field">
        <%= f.label :usuario_id %><br />
        <%= f.text_field :usuario_id %>
    ...

    app/views/microposts/_form.html.erb modificado.
    ...
     <div class="field">
        <%= f.label :usuario_id %><br />
        <%= f.collection_select :usuario_id, 
             Usuario.all, :id, :nome  %>
    ...
Mão na massa


●
    Relacionamento (views)
Mão na massa


●
    Validações
    app/models/usuario.rb

    class Usuario < ActiveRecord::Base
       has_many :microposts, :dependent => :destroy
       validates_presence_of   :nome, :email
       validates_uniqueness_of :email
    end
Mão na massa


●
    Validações
Mão na massa


●
    Validações
    app/models/micropost.rb

    class Micropost < ActiveRecord::Base
       belongs_to :usuario
       validates_presence_of :conteudo
       validates_length_of    :conteudo, :maximum => 140
    end
                              OU

    class Micropost < ActiveRecord::Base
       belongs_to :usuario
       validates :conteudo, 
                 :presence => true,
                 :length => {:maximum => 140}
    end
Mão na massa


●
    Validações
Mão na massa


●
    Gems
    ●
        Gerenciador de pacotes do Ruby
    ●
        Facilita distribuicão de códigos
    ●
        Age como o apt-get (derivados do Debian)
    ●
        No Rails as gems podem ser adicionadas no arquivo Gemfile
O que vimos até agora
●   Brevemente aspectos principais da sintaxe Ruby
●   Principais características do Rails
●   Como criar uma aplicacão
●   Criar controller e actions
●   Layouts
●   Scaffolding
●   Active Record
●   Validacões
●   Gems
Próximos passos
●
    Aprender mais!
    ●
        www.ruby-br.org
    ●
        www.rubyonrails.com.br
    ●
        www.akitaonrails.com
    ●
        www.ruby.railstutorial.org/ruby-on-rails-tutorial-book
        (em inglês)
PERGUNTAS ???
●
    Podem me escrever diretamente
    ●
        juliobetta@gmail.com

Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

  • 1.
    Desenvolvimento Web com Ruby on Rails Por Júlio Bêtta
  • 2.
    Por que Ruby??? ● Linguagem dinâmica ● Totalmente Orientado a Objetos ● Sintaxe flexível ● Cross-plataform Ruby(C), jRuby(Java), IronRuby(.NET) ● Software Livre ● Programadores mais felizes =)
  • 3.
  • 4.
    Sobre o Rubyon Rails ● Framework web implementado na linguagem Ruby ● Desenvolvimento ágil de aplicações web ● MVC ● Utiliza o conceito Convention over Configuration (CoC) ● E muito mais ...
  • 5.
    Ruby on Rails ● Principais Banco de Dados Suportados ● SQlite 3 (padrão) ● MySQL ● PostgreSQL ● Oracle ● Microsoft SQL Server
  • 6.
    Ruby on Rails ● Instalação ● Windows: http://railsinstaller.org ● Linux (Ubuntu): https://github.com/juliobetta/RoR/tree/master/installation Os exemplos a seguir foram testados apenas em ambiente LINUX.
  • 7.
  • 8.
    Sintaxe ● IRB    Programa iniciado na linha de comando que permite a execução de comandos em Ruby com responta em tempo-real.        Todos os comandos a seguir podem ser testados utilizando o irb.
  • 9.
    Sintaxe ● Strings    "eu sou uma string" 'Ruby ' + 'on Rails'       
  • 10.
    Sintaxe ● Variáveis Não é preciso declarar o tipo: nome = "Ruby" Porém a tipagem no Ruby é forte: versao = 3 nome   = "Rails " + versao (TYPE ERROR) versao = 3 nome   = "Rails " + versao.to_s Podemos avaliar expressões dentro de strings com conversão automática: versao = 3 nome   = "Ruby"  curso  = "#{nome} on Rails #{versao}"
  • 11.
    Sintaxe ● Operações básicas 1 + 2   # adição 4 – 2   # subtração 2 * 2   # multiplicação 6 / 2   # divisão 15 % 2  # modulo ● Operadores 5 == (2+3) # igualdade 2 != 3     # inigualdade  10 > 13    # maior 3  <  10   # menor 5  <= 5    # menor ou igual 5  >= 5    # maior ou igual
  • 12.
    Sintaxe ● Controles de fluxo Maneira usual: idade = 15    if (idade < 16) then    puts 'que pariu! Você não deveria estar dirigindo.' end     
  • 13.
    Sintaxe ● Controles de fluxo Maneira usual um pouco melhor: idade = 15    if idade < 16    puts 'Você não deveria estar dirigindo.' end     
  • 14.
    Sintaxe ● Controles de fluxo Isso é ótimo: idade = 15    puts 'Você não deveria estar dirigindo.' if idade < 16     
  • 15.
    Sintaxe ● Controles de fluxo Algo diferente: idade = 15 unless idade >= 16    puts 'Você não deveria estar dirigindo.'    end ou:      idade = 15 puts 'Você não deveria estar dirigindo.' unless idade >= 16
  • 16.
    Sintaxe ● Controles de fluxo Não me esqueci do else: idade = 18 if idade < 16    puts 'Você não deveria estar dirigindo.'    else    puts 'Pode seguir!' end      Famosos operadores ternários: idade = 18 puts idade >= 16 ? 'Pode seguir!':'Vai pra casa!'
  • 17.
    Sintaxe ● Controles de fluxo Loops for i in 1..10 5.times do |n| 5.upto(10) do puts i puts n puts 'Oi!' end end end    letras = ['a','b','c','d']    letras.each do |letra| puts letra   end i = 0 while i < 5 puts i i += 1 end
  • 18.
    Sintaxe ● Arrays e Hashes Arrays objetos   = ['carro','bicicleta','pizza']    objetos   = %w(teclado mouse livro) puts objetos[0]    Hash atributos = {:nome      => 'Yukihiro',                :sobrenome => 'Matsumoto',              :email     => 'matz@ruby.co.jp'} puts atributos[:nome]
  • 19.
    Sintaxe ● Ruby :symbols São cadeias de caracteres usualmente utilizados como identificadores. Eles são como strings , porém reusam o mesmo espaço de memória. Vejamos: "carro".object_id => 2953810 "carro".object_id    => 2951340 :carro.object_id    => 166418 :carro.object_id   => 166418
  • 20.
    Sintaxe ● Métodos (funções) def diga_adeus_para(nome, sobrenome)    "Adeus #{nome} #{sobrenome}..." end    puts diga_adeus_para("Yukihiro", "Matsumoto")      Como parênteses neste caso são opcionais, soa mais natural como: puts diga_adeus_para "Yukihiro", "Matsumoto"
  • 21.
    Sintaxe ● Classes A maneira mais longa: … e a mais curta: class Pessoa class Pessoa    @nome    attr_accessor :nome,    @sobrenome     :sobrenome end def nome Define getters e setters          @nome end def sobrenome class Pessoa          @sobrenome    attr_reader :nome, end   :sobrenome   end def nome=(nome) Define somente getters   @nome = nome end class Pessoa    attr_writer :nome, def sobrenome=(sobrenome)   :sobrenome   @sobrenome = sobrenome end end end Define somente setters
  • 22.
    Sintaxe ● Classes Criar novas instância com o método .new matz = Pessoa.new matz.nome      = "Yukihiro"  matz.sobrenome = "Matsumoto"    puts matz.nome puts matz.sobrenome     
  • 23.
    Sintaxe ● Classes Herança class Usuario < Pessoa    attr_accessor :nome_usuario,      :senha    end matz = Usuario.new    matz.nome         = "Yukihiro"  matz.sobrenome    = "Matsumoto"   matz.nome_usuario = "matz" matz.senha     = "abc123"
  • 24.
    Sintaxe ● Classes As classes são abertas: class Pessoa def initialize(nome, sobrenome) @nome   = nome    @sobrenome = sobrenome  end    def to_s "#{@nome} #{@sobrenome}"   end end matz = Pessoa.new "Yukihiro", "Matsumoto" puts matz
  • 25.
  • 26.
    Mão na massa ● Switter ● Aplicação similar a uma seção do famoso microblog ● Exibir usuários e microposts (sweets) Entidades
  • 27.
    Mão na massa ● Switter $ rails new switter Estrutura de diretórios gerada automaticamente
  • 28.
    Mão na massa ● Switter Organiza a aplicação em componentes
  • 29.
    Mão na massa ● Switter Configuração da aplicação Arquivos estáticos
  • 30.
    Mão na massa ● Página Inicial Criando um Controller: No terminal: $ rails generate controller paginas inicio
  • 31.
    Mão na massa ● Página Inicial $ rails generate controller paginas inicio Arquivos gerados automaticamente na pasta app
  • 32.
    Mão na massa ● Página Inicial Criando uma Action no Controller que acabamos de gerar: app/views/paginas/inicio.html.erb <h2>Seja bem­vindo ao Switter!!!</h2> app/controllers/paginas_controller.rb class PaginasController < ApplicationController def inicio render 'paginas/inicio' end end
  • 33.
    Mão na massa ● Layout padrão ● Contém a estrutura HTML da aplicação; ● A ideia é que as views geradas nos controllers sejam incluídas neste arquivo, através do método yield. app/views/layouts/application.html.erb <!DOCTYPE html> <html> <head>   <title>Switter</title>   <%= stylesheet_link_tag    "application" %>   <%= javascript_include_tag "application" %>   <%= csrf_meta_tags %> </head> <body> <%= yield %> </body> </html>
  • 34.
    Mão na massa ● Rotas Sistema que examina a URL solicitada e determina qual ação deve deve ser executada pela aplicação. config/routes.rb Switter::Application.routes.draw do    get 'paginas/inicio' end
  • 35.
    Mão na massa ● Inicialização Rails já possui um webserver embutido: $ rails server
  • 36.
    Mão na massa ● Scaffolding ● Criar model, controller e views para criar, exibir, atualizar e deletar (CRUD) o recurso que especificarmos ● Também é responsável por criar as tabelas do banco de dados $ rails generate scaffold usuario nome:string    email:string $ rails generate scaffold micropost   usuario_id:integer conteudo:string 
  • 37.
    Mão na massa ● Scaffolding Estrutura gerada na pasta app
  • 38.
    Mão na massa ● Scaffolding Rotas geradas config/routes.rb Switter::Application.routes.draw do   get 'paginas/inicio'   resources :usuarios   resources :microposts end
  • 39.
    Mão na massa ● Migrations $ rake db:migrate
  • 40.
    Mão na massa ● Rake ● Executar tarefas ● Funciona como o Make, Ant, etc... ● Utilizado para gerenciar banco de dados, rodar testes, e o que mais for preciso ● Executar tarefas personalizadas   $ rake ­­tasks
  • 41.
    Mão na massa ● Scaffolding
  • 42.
    Mão na massa ● Scaffolding
  • 43.
    Mão na massa ● Scaffolding é bom porque... ● É rapido ● Mostra como o Rails funciona ● Usa padrões que usaremos no dia-a-dia
  • 44.
    Mão na massa ● Scaffolding é ruim porque... ● O código não é otimizado ● Pode adicionar mais código do que venhamos precisar ● É muito simplório (uma tabela, sem possibilidades de gerar relacionamentos automaticamente) Profissionais da área não utilizam esta técnica em ambiente de produção.
  • 45.
    Mão na massa ● ActiveRecord ● Biblioteca ORM que encapsula as tabelas do banco de dados como objetos ● Utiliza o poder do Ruby de gerar código (metaprogramação)
  • 46.
    Mão na massa ● ActiveRecord Interativo Os exemplos a seguir podem ser testados por meio do rails console, que pode ser executado de duas maneiras: $ rails console $ rails console ­­sandbox Com o parâmetro sandbox ativado, toda mudança no banco de dados será desfeita após a saída do console. * utilizar o comando exit para sair do console.
  • 47.
    Mão na massa ● ActiveRecord Interativo Criar um usuário:  matz=Usuario.new({:nome  => 'Yukihiro',    :email => 'matz@ruby.co.jp'})  matz.save Selecionar usuário:  matz = Usuario.where({:nome => 'Yukihiro'}) Alterar usuário:  matz.nome = 'Yukihiro Matsumoto'  matz.save Deletar usuário:  Usuario.find(1).destroy
  • 48.
    Mão na massa ● Relacionamento Como vimos no início, um usuário possui vários microposts e um micropost pertence a apenas um usuário. Entidades
  • 49.
    Mão na massa ● Relacionamento app/models/usuario.rb class Usuario < ActiveRecord::Base has_many :microposts end app/models/micropost.rb class Micropost < ActiveRecord::Base belongs_to :usuario end Com isso, é gerado, via metaprogramação, o método usuario na instância da classe Micropost e o método microposts na instância da classe Usuario.
  • 50.
    Mão na massa ● Relacionamento (console) Listar todos os microposts de um determinado usuário:  # seleciona o último usuario inserido no BD  usuario = Usuario.last  # e atribui a variavel todos seus microposts  microposts = usuario.microposts  Cria um micropost e o atribui a um usuário: matz = Usuario.where :nome => 'Yukihiro Matsumoto' micropost = Micropost.new micropost.conteudo = 'Eu sou o criador do Ruby!' micropost.usuario = matz micropost.save # imprime Yukihiro Matsumoto puts micropost.usuario.nome 
  • 51.
    Mão na massa ● Relacionamento (views) app/views/microposts/index.html.erb gerado pelo scaffold. ... <tr>     <td><%= micropost.usuario_id %></td>     <td><%= micropost.conteudo %></td> ... app/views/microposts/index.html.erb modificado. ... <tr>     <td><%= micropost.usuario.nome %></td>     <td><%= micropost.conteudo %></td> ...
  • 52.
    Mão na massa ● Relacionamento (views)
  • 53.
    Mão na massa ● Relacionamento (views) app/views/microposts/_form.html.erb gerado pelo scaffold. ...  <div class="field">     <%= f.label :usuario_id %><br />     <%= f.text_field :usuario_id %> ... app/views/microposts/_form.html.erb modificado. ...  <div class="field">     <%= f.label :usuario_id %><br />     <%= f.collection_select :usuario_id,     Usuario.all, :id, :nome  %> ...
  • 54.
    Mão na massa ● Relacionamento (views)
  • 55.
    Mão na massa ● Validações app/models/usuario.rb class Usuario < ActiveRecord::Base has_many :microposts, :dependent => :destroy validates_presence_of   :nome, :email validates_uniqueness_of :email end
  • 56.
    Mão na massa ● Validações
  • 57.
    Mão na massa ● Validações app/models/micropost.rb class Micropost < ActiveRecord::Base belongs_to :usuario validates_presence_of :conteudo validates_length_of  :conteudo, :maximum => 140 end OU class Micropost < ActiveRecord::Base belongs_to :usuario validates :conteudo,    :presence => true,   :length => {:maximum => 140} end
  • 58.
    Mão na massa ● Validações
  • 59.
    Mão na massa ● Gems ● Gerenciador de pacotes do Ruby ● Facilita distribuicão de códigos ● Age como o apt-get (derivados do Debian) ● No Rails as gems podem ser adicionadas no arquivo Gemfile
  • 60.
    O que vimosaté agora ● Brevemente aspectos principais da sintaxe Ruby ● Principais características do Rails ● Como criar uma aplicacão ● Criar controller e actions ● Layouts ● Scaffolding ● Active Record ● Validacões ● Gems
  • 61.
    Próximos passos ● Aprender mais! ● www.ruby-br.org ● www.rubyonrails.com.br ● www.akitaonrails.com ● www.ruby.railstutorial.org/ruby-on-rails-tutorial-book (em inglês)
  • 62.
    PERGUNTAS ??? ● Podem me escrever diretamente ● juliobetta@gmail.com