Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

62
Desenvolvimento Web com Desenvolvimento Web com Ruby on Rails Ruby on Rails Por Júlio Bêtta Por Júlio Bêtta

description

Slides que utilizei para ministrar uma palestra sobre Desenvolvimento WEB com Ruby on Rails no IV Congresso de Iniciação Científica da Faculdade Redentor de Itaperuna / RJ em Novembro de 2011.

Transcript of Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Page 1: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Desenvolvimento Web com Desenvolvimento Web com Ruby on RailsRuby on Rails

Por Júlio BêttaPor Júlio Bêtta

Page 2: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Por que Ruby ???Por que Ruby ???

● Linguagem dinâmicaLinguagem dinâmica● Totalmente Orientado a ObjetosTotalmente Orientado a Objetos● Sintaxe flexívelSintaxe flexível● Cross-plataformCross-plataform

Ruby(C), jRuby(Java), IronRuby(.NET)Ruby(C), jRuby(Java), IronRuby(.NET)

● Software LivreSoftware Livre● Programadores mais felizes =)Programadores mais felizes =)

Page 3: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Ruby on RailsRuby on Rails

Page 4: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Framework web implementado na linguagem RubyFramework web implementado na linguagem Ruby● Desenvolvimento ágil de aplicações webDesenvolvimento ágil de aplicações web● MVCMVC● Utiliza o conceito Convention over Configuration (CoC)Utiliza o conceito Convention over Configuration (CoC)● E muito mais ...E muito mais ...

Sobre o Ruby on RailsSobre o Ruby on Rails

Page 5: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Principais Banco de Dados SuportadosPrincipais Banco de Dados Suportados

Ruby on Rails

● SQlite 3 (padrão)● MySQL● PostgreSQL● Oracle● Microsoft SQL Server

Page 6: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● InstalaçãoInstalaçã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.Os exemplos a seguir foram testados apenas em ambiente LINUX.

Ruby on Rails

Page 7: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

SintaxeSintaxe

Page 8: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● IRBIRB    

      

    

Sintaxe

Programa iniciado na linha de comando que permite a execução de Programa iniciado na linha de comando que permite a execução de comandos em Ruby com responta em tempo-real.comandos em Ruby com responta em tempo-real.

Todos os comandos a seguir podem ser testados utilizando oTodos os comandos a seguir podem ser testados utilizando o irb irb..

Page 9: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● StringsStrings    

      

    

Sintaxe

"eu sou uma string"'Ruby ' + 'on Rails'

Page 10: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● VariáveisVariáveis Sintaxe

nome = "Ruby"

versao = 3nome   = "Rails " + versao (TYPE ERROR)

Não é preciso declarar o tipo:Não é preciso declarar o tipo:

Porém a tipagem no Ruby é forte:Porém a tipagem no Ruby é forte:

versao = 3nome   = "Ruby" curso  = "#{nome} on Rails #{versao}"

Podemos avaliar expressões dentro de strings com conversão Podemos avaliar expressões dentro de strings com conversão automática:automática:

versao = 3nome   = "Rails " + versao.to_s

Page 11: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Operações básicasOperações básicas

● OperadoresOperadores

Sintaxe

5 == (2+3) # igualdade2 != 3     # inigualdade 10 > 13    # maior3  <  10   # menor5  <= 5    # menor ou igual5  >= 5    # maior ou igual

1 + 2   # adição4 – 2   # subtração2 * 2   # multiplicação6 / 2   # divisão15 % 2  # modulo

Page 12: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoManeira usual:Maneira usual:

    

    

  

Sintaxe

idade = 15if (idade < 16) then   puts 'que pariu! Você não deveria estar dirigindo.'end

Page 13: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoManeira usual um pouco melhor:Maneira usual um pouco melhor:

    

    

  

Sintaxe

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

Page 14: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoIsso é ótimo:Isso é ótimo:

    

    

  

Sintaxe

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

Page 15: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoAlgo diferente:Algo diferente:

    

    

  

Sintaxe

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

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

ou:

Page 16: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoNão me esqueci do else:Não me esqueci do else:

    

    

  

Sintaxe

idade = 18if idade < 16   puts 'Você não deveria estar dirigindo.'else   puts 'Pode seguir!'end

idade = 18puts idade >= 16 ? 'Pode seguir!':'Vai pra casa!'

Famosos operadores ternários:

Page 17: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Controles de fluxoControles de fluxoLoopsLoops

    

    

  

Sintaxe

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

puts letraend

for i in 1..10puts i

end

5.times do |n|puts n

end

5.upto(10) doputs 'Oi!'

end

i = 0while i < 5

puts ii += 1

end

Page 18: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Arrays e HashesArrays e Hashes

    

    

  

Sintaxe

objetos   = ['carro','bicicleta','pizza']objetos   = %w(teclado mouse livro)puts objetos[0]

ArraysArrays

atributos = {:nome      => 'Yukihiro',             :sobrenome => 'Matsumoto',             :email     => '[email protected]'}puts atributos[:nome]

HashHash

Page 19: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Ruby :symbolsRuby :symbolsSão cadeias de caracteres usualmente utilizados como identificadores. São cadeias de caracteres usualmente utilizados como identificadores. Eles são como strings , porém reusam o mesmo espaço de memória.Eles são como strings , porém reusam o mesmo espaço de memória.

Vejamos:Vejamos:

    

    

  

Sintaxe

"carro".object_id=> 2953810"carro".object_id=> 2951340

:carro.object_id=> 166418:carro.object_id=> 166418

Page 20: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Métodos (funções)Métodos (funções)

    

    

  

Sintaxe

def diga_adeus_para(nome, sobrenome)   "Adeus #{nome} #{sobrenome}..."end

puts diga_adeus_para("Yukihiro", "Matsumoto")

puts diga_adeus_para "Yukihiro", "Matsumoto"

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

Page 21: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ClassesClasses

    

    

  

Sintaxe

class Pessoa   @nome   @sobrenome

def nome     @nome

end

def sobrenome     @sobrenome

end

def nome=(nome)  @nome = nomeend

def sobrenome=(sobrenome)  @sobrenome = sobrenomeend

end

A maneira mais longa:A maneira mais longa: … … e a mais curta:e a mais curta:class Pessoa   attr_accessor :nome,

    :sobrenomeend

Define getters e settersDefine getters e setters

class Pessoa   attr_reader :nome,

  :sobrenomeend

Define somente gettersDefine somente getters

class Pessoa   attr_writer :nome,

  :sobrenomeend

Define somente settersDefine somente setters

Page 22: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ClassesClasses

    

    

  

Sintaxe

matz = Pessoa.newmatz.nome      = "Yukihiro" matz.sobrenome = "Matsumoto"puts matz.nomeputs matz.sobrenome

Criar novas instância com o método .newCriar novas instância com o método .newCriar novas instância com o método .newCriar novas instância com o método .new

Page 23: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ClassesClasses

    

    

  

Sintaxe

HerançaHerança

class Usuario < Pessoa   attr_accessor :nome_usuario,

     :senhaend

matz = Usuario.newmatz.nome         = "Yukihiro" matz.sobrenome    = "Matsumoto"matz.nome_usuario = "matz"matz.senha     = "abc123"

Page 24: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ClassesClasses

    

    

  

Sintaxe

class Pessoadef initialize(nome, sobrenome)

@nome   = nome@sobrenome = sobrenome 

end

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

endend

As classes são abertas:As classes são abertas:

matz = Pessoa.new "Yukihiro", "Matsumoto"puts matz

Page 25: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Mão na massa !!!Mão na massa !!!

Page 26: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● SwitterSwitter

Mão na massa

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

Entidades

Page 27: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● SwitterSwitter

Mão na massa

$ rails new switter

Estrutura de diretórios gerada Estrutura de diretórios gerada automaticamenteautomaticamente

Page 28: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● SwitterSwitter

Mão na massa

Organiza a aplicação em Organiza a aplicação em componentescomponentes

Page 29: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● SwitterSwitter

Mão na massa

Configuração da aplicaçãoConfiguração da aplicação Arquivos estáticosArquivos estáticos

Page 30: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Página InicialPágina Inicial

Mão na massa

$ rails generate controller paginas inicio

Criando um Controller:Criando um Controller:

No terminal:

Page 31: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Página InicialPágina Inicial

Mão na massa

$ rails generate controller paginas inicio

Arquivos gerados automaticamente Arquivos gerados automaticamente na pasta na pasta appapp

Page 32: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Página InicialPágina Inicial

Mão na massa

Criando uma Action no Controller que acabamos de gerar:Criando uma Action no Controller que acabamos de gerar:

class PaginasController < ApplicationControllerdef inicio

render 'paginas/inicio'end

end

app/controllers/paginas_controller.rbapp/controllers/paginas_controller.rb

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

app/views/paginas/inicio.html.erbapp/views/paginas/inicio.html.erb

Page 33: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Layout padrãoLayout padrão

Mão na massa

<!DOCTYPE html><html><head>  <title>Switter</title>  <%= stylesheet_link_tag    "application" %>  <%= javascript_include_tag "application" %>  <%= csrf_meta_tags %></head><body><%= yield %></body></html>

● 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.erbapp/views/layouts/application.html.erb

Page 34: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● RotasRotas

Mão na massa

Switter::Application.routes.draw do   get 'paginas/inicio'end

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

config/routes.rbconfig/routes.rb

Page 35: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● InicializaçãoInicialização

Mão na massa

Rails já possui um webserver embutido:Rails já possui um webserver embutido:

$ rails server

Page 36: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ScaffoldingScaffolding

Mão na massa

● 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 

Page 37: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ScaffoldingScaffolding

Mão na massa

Estrutura gerada na pasta Estrutura gerada na pasta appapp

Page 38: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ScaffoldingScaffolding

Mão na massa

Rotas geradas Rotas geradas

Switter::Application.routes.draw do  get 'paginas/inicio'  resources :usuarios  resources :micropostsend

config/routes.rbconfig/routes.rb

Page 39: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● MigrationsMigrations

Mão na massa

$ rake db:migrate

Page 40: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● RakeRake

Mão na massa

● 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

Page 41: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ScaffoldingScaffolding

Mão na massa

Page 42: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ScaffoldingScaffolding

Mão na massa

Page 43: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Scaffolding é bom porque...Scaffolding é bom porque...

Mão na massa

● É rapido● Mostra como o Rails funciona● Usa padrões que usaremos no dia-a-dia

Page 44: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Scaffolding é ruim porque...Scaffolding é ruim porque...

Mão na massa

● 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.Profissionais da área não utilizam esta técnica em ambiente de produção.

Page 45: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ActiveRecordActiveRecord

Mão na massa

● Biblioteca ORM que encapsula as tabelas do banco de dados como objetos

● Utiliza o poder do Ruby de gerar código (metaprogramação)

Page 46: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ActiveRecord InterativoActiveRecord Interativo

Mão na massa

Os exemplos a seguir podem ser testados por meio do Os exemplos a seguir podem ser testados por meio do rails consolerails console, que , que ppode ser executado de duas maneiras:ode ser executado de duas maneiras:

$ rails console

$ rails console ­­sandbox

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

* utilizar o comando exit para sair do console.* utilizar o comando exit para sair do console.

Page 47: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ActiveRecord InterativoActiveRecord Interativo

Mão na massa

 matz=Usuario.new({:nome  => 'Yukihiro',   :email => '[email protected]'})

 matz.save

Criar um usuário:Criar um usuário:

 matz = Usuario.where({:nome => 'Yukihiro'})Selecionar usuário:Selecionar usuário:

 matz.nome = 'Yukihiro Matsumoto' matz.save

Alterar usuário:Alterar usuário:

 Usuario.find(1).destroy

Deletar usuário:Deletar usuário:

Page 48: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● RelacionamentoRelacionamento

Mão na massa

Como vimos no início, um usuário possui vários microposts e um Como vimos no início, um usuário possui vários microposts e um micropost pertence a apenas um usuário. micropost pertence a apenas um usuário.

Entidades

Page 49: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● RelacionamentoRelacionamento

Mão na massa

class Usuario < ActiveRecord::Basehas_many :microposts

end

app/models/usuario.rbapp/models/usuario.rb

class Micropost < ActiveRecord::Basebelongs_to :usuario

end

app/models/micropost.rbapp/models/micropost.rb

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

Page 50: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Relacionamento (console)Relacionamento (console)

Mão na massa

 # seleciona o último usuario inserido no BD usuario = Usuario.last # e atribui a variavel todos seus microposts microposts = usuario.microposts 

Listar todos os microposts de um determinado usuário:Listar todos os microposts de um determinado usuário:

matz = Usuario.where :nome => 'Yukihiro Matsumoto'micropost = Micropost.newmicropost.conteudo = 'Eu sou o criador do Ruby!'micropost.usuario = matzmicropost.save# imprime Yukihiro Matsumotoputs micropost.usuario.nome 

Cria um micropost e o atribui a um usuário:Cria um micropost e o atribui a um usuário:

Page 51: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Relacionamento (views)Relacionamento (views)

Mão na massa

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

app/views/microposts/index.html.erb app/views/microposts/index.html.erb gerado pelo scaffold.gerado pelo scaffold.

...<tr>    <td><%= micropost.usuario.nome %></td>    <td><%= micropost.conteudo %></td>...

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

Page 52: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Relacionamento (views)Relacionamento (views)

Mão na massa

Page 53: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Relacionamento (views)Relacionamento (views)

Mão na massa

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

app/views/microposts/_form.html.erb app/views/microposts/_form.html.erb gerado pelo scaffold.gerado pelo scaffold.

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

   Usuario.all, :id, :nome  %>...

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

Page 54: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● Relacionamento (views)Relacionamento (views)

Mão na massa

Page 55: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ValidaValidaçõesções

Mão na massa

class Usuario < ActiveRecord::Basehas_many :microposts, :dependent => :destroyvalidates_presence_of   :nome, :emailvalidates_uniqueness_of :email

end

app/models/usuario.rbapp/models/usuario.rb

Page 56: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ValidaValidaçõesções

Mão na massa

Page 57: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ValidaValidaçõesções

Mão na massa

class Micropost < ActiveRecord::Basebelongs_to :usuariovalidates_presence_of :conteudovalidates_length_of  :conteudo, :maximum => 140

end

app/models/micropost.rbapp/models/micropost.rb

class Micropost < ActiveRecord::Basebelongs_to :usuariovalidates :conteudo, 

  :presence => true,  :length => {:maximum => 140}

end

OUOU

Page 58: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● ValidaValidaçõesções

Mão na massa

Page 59: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

● GemsGems

Mão na massa

● 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

Page 60: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

O que vimos até agoraO que vimos até agora

● Brevemente aspectos principais da sintaxe RubyBrevemente aspectos principais da sintaxe Ruby

● Principais características do RailsPrincipais características do Rails

● Como criar uma aplicacãoComo criar uma aplicacão

● Criar controller e actionsCriar controller e actions

● LayoutsLayouts

● ScaffoldingScaffolding

● Active RecordActive Record

● ValidacõesValidacões

● GemsGems

Page 61: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

Próximos passosPróximos passos

● Aprender mais!Aprender mais!● www.ruby-br.orgwww.ruby-br.org ● www.rubyonrails.com.brwww.rubyonrails.com.br● www.akitaonrails.comwww.akitaonrails.com● www.ruby.railstutorial.org/ruby-on-rails-tutorial-bookwww.ruby.railstutorial.org/ruby-on-rails-tutorial-book

(em inglês)(em inglês)

Page 62: Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)

PERGUNTAS ???PERGUNTAS ???

● Podem me escrever diretamentePodem me escrever diretamente● [email protected]@gmail.com