Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
-
Upload
julio-betta -
Category
Technology
-
view
873 -
download
0
description
Transcript of 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
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 =)
Ruby on RailsRuby on Rails
● 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
● Principais Banco de Dados SuportadosPrincipais Banco de Dados Suportados
Ruby on Rails
● SQlite 3 (padrão)● MySQL● PostgreSQL● Oracle● Microsoft SQL Server
● 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
SintaxeSintaxe
● 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..
● StringsStrings
Sintaxe
"eu sou uma string"'Ruby ' + 'on Rails'
● 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
● 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
● Controles de fluxoControles de fluxoManeira usual:Maneira usual:
Sintaxe
idade = 15if (idade < 16) then puts 'que pariu! Você não deveria estar dirigindo.'end
● 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
● Controles de fluxoControles de fluxoIsso é ótimo:Isso é ótimo:
Sintaxe
idade = 15puts 'Você não deveria estar dirigindo.' if idade < 16
● 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:
● 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:
● 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
● 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
● 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
● 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:
● 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
● 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
● 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"
● 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
Mão na massa !!!Mão na massa !!!
● SwitterSwitter
Mão na massa
● Aplicação similar a uma seção do famoso microblog● Exibir usuários e microposts (sweets)
Entidades
● SwitterSwitter
Mão na massa
$ rails new switter
Estrutura de diretórios gerada Estrutura de diretórios gerada automaticamenteautomaticamente
● SwitterSwitter
Mão na massa
Organiza a aplicação em Organiza a aplicação em componentescomponentes
● SwitterSwitter
Mão na massa
Configuração da aplicaçãoConfiguração da aplicação Arquivos estáticosArquivos estáticos
● Página InicialPágina Inicial
Mão na massa
$ rails generate controller paginas inicio
Criando um Controller:Criando um Controller:
No terminal:
● 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
● 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 bemvindo ao Switter!!!</h2>
app/views/paginas/inicio.html.erbapp/views/paginas/inicio.html.erb
● 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
● 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
● InicializaçãoInicialização
Mão na massa
Rails já possui um webserver embutido:Rails já possui um webserver embutido:
$ rails server
● 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
● ScaffoldingScaffolding
Mão na massa
Estrutura gerada na pasta Estrutura gerada na pasta appapp
● 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
● MigrationsMigrations
Mão na massa
$ rake db:migrate
● 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
● ScaffoldingScaffolding
Mão na massa
● ScaffoldingScaffolding
Mão na massa
● 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
● 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.
● 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)
● 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.
● 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:
● 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
● 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.
● 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:
● 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.
● Relacionamento (views)Relacionamento (views)
Mão na massa
● 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.
● Relacionamento (views)Relacionamento (views)
Mão na massa
● 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
● ValidaValidaçõesções
Mão na massa
● 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
● ValidaValidaçõesções
Mão na massa
● 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
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
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)
PERGUNTAS ???PERGUNTAS ???
● Podem me escrever diretamentePodem me escrever diretamente● [email protected]@gmail.com