Post on 19-May-2015
Ruby on Rails na prática
Túlio Ornelas
2
3
Agenda
• Sobre o Ruby
• Como instalar
• Algumas estruturas da linguagem
• Sobre o Rails
• Como instalar
• Algumas Características do framework
• Primeiro CRUD
• Associações
• Segundo CRUD
Um pouco sobre Ruby
• Criada em 1993 por Yukihiro Matz
• Linguagem interpretada
• “Tipagem” dinâmica
• Orientada a objetos
• Livre
• http://www.ruby-lang.org/
4
Um pouco sobre Ruby
• Instalando
- Linux: sudo apt-get install ruby
- Windows: One-Click-Installer
• http://rubyinstaller.org/download.html
- Mac OS X: sudo port install ruby
• Testando a instalação
- ruby -v
- irb -v
5
[tulios] ~ ruby -vruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0][tulios] ~ irb -virb 0.9.5(05/04/13)
Um pouco sobre Ruby
• Interpretando um comando
- Interactive Ruby Shell (IRB)
• Interpretando um arquivo
- <nome>.rb
6
[tulios] ~ irb>> puts "Oi"Oi
[tulios] ~ ruby file.rb
Um pouco sobre Ruby
• Em Ruby tudo é OO
7
[tulios] ~ irb>> 12.class=> Fixnum
>> true.class=> TrueClass
>> nil.class=> NilClass
>> "Tulio".class=> String
Um pouco sobre Ruby
• Booleans
- As únicas coisas falsas são nil e false
8
[tulios] ~ irb>> if 12>> puts "verdadeiro!">> endverdadeiro!
>> if nil>> puts "falso!">> end
>> if 0>> puts "verdadeiro!">> endverdadeiro!
>> if false>> puts "falso!">> end
Um pouco sobre Ruby
• Variáveis
- Local user
- De instância @user
- De classe @@user
- Globais $user
• Variáveis de classe são comparadas a atributos estáticos (static) em Java.
9
Um pouco sobre Ruby
•Criando uma classe
- Em Ruby Em Java
10
Um pouco sobre Ruby
•Criando um objeto
- Ruby
- Java
•Note a sintaxe simplificada, não é necessário declarar o tipo da variável.
11
Um pouco sobre Ruby
•Criando uma classe com método
- Ruby Java
12
Um pouco sobre Ruby
•Utilizando a classe no IRB
- Importar a classe: require
13
[tulios] ~ irb>> require 'user'=> true
>> user = User.new=> #<User:0x1011cae60>
>> user.ola=> "oi!"
Um pouco sobre Ruby
•Utilizando construtores
- Ruby Java
14
Um pouco sobre Ruby
•Analisando
15
- Não é necessário definir o tipo de retorno
- Não é necessário utilizar parênteses ().
Um pouco sobre Ruby
•Construtor e “sobrecarga” do construtor
16
Um pouco sobre Ruby
• Métodos
- De instância
- Da classe
17
Um pouco sobre Ruby
•Vamos praticar!
18
[tulios] ~ irb>> require 'user'=> true
>> user = User.new "Tulio"=> #<User:0x101238410 @nome="Tulio">
>> user.equals? "Karina"=> false
>> User.compare "Tulio", "Renan"=> false
Um pouco sobre Ruby
•Todo atributo em Ruby é privado!
19
?> user.nomeNoMethodError: undefined method `nome' for #<User:0x101238410 @nome="Tulio"> from (irb):6
Um pouco sobre Ruby
•Métodos de acesso as variáveis
20
Um pouco sobre Ruby
•Vamos testar!
21
[tulios] ~ irb>> require 'user'=> true
>> user = User.new=> #<User:0x1012394a0 @nome="">
>> user.nome = "Tulio"=> "Tulio"
>> user.nome=> "Tulio"
Um pouco sobre Ruby
•Como criar o get e o set “na mão”?
22
[tulios] ~ irb>> require 'user'=> true
>> user = User.new=> #<User:0x1012394a0 @nome="">
>> user.nome = "Tulio"=> "Tulio"
>> user.nome=> "Tulio"
Um pouco sobre Ruby•Modificadores de acesso
- Privados e protegidos
- Públicos
• Modificador padrão, não é necessário explicitar (Também podemos utilizar a palavra public)
23
Um pouco sobre Ruby
•Utilizando a classe em outro .rb
- Importar a classe: require
24
Um pouco sobre Ruby
•Herança
25
Um pouco sobre Ruby
•Testando
26
[tulios] ~ irb>> require 'user'=> true
>> user = User.new "123456"=> #<User:0x101230bc0 @idade=0, @senha="123456", @nome="Vazio">
>> user.nome=> "Vazio">> user.idade=> 0>> user.idade = 10=> 10>> user.adulto?=> false
Um pouco sobre Ruby
•Testando a herança
27
[tulios] ~ irb>> require 'user'=> true
>> Person.superclass=> Object
>> User.superclass=> Person
>> User.superclass.superclass=> Object
Um pouco sobre Ruby
• Loops
- for
28
Exercício
• Imprimir os números impares até 10
29
Exercício
• Solução
30
Um pouco sobre Ruby
•Outros Loops
- while
31
Um pouco sobre Ruby
32
•Outros Loops
- iteradores
Um pouco sobre Ruby
33
•Outros Loops
- métodos da classe Fixnum
Um pouco sobre Ruby
•Array e Hash
34
Um pouco sobre Ruby
• Exceções
35
Um pouco sobre Ruby
•Classes abertas
36
[tulios] ~ irb>> require 'arquivo'=> true
>> 1.impar?=> true>> 3.par?=> false>> 4.par?=> true
O que é o Rails?
•Meta-framework MVC
•Desenvolvido em linguagem Ruby
•Baseado em convenções
• http://guias.rubyonrails.pro.br/
38
Rails
• Lançado em julho de 2004
•Criado por David Heinemeir Hansson
•Conceitos
- DRY (Don’t Repeat Yourself)
- Convention over Configuration
39
Rails - composição
• O Rails é a junção de 5 frameworks
- Active Record (ORM)
- Action Pack (MVC)
- Action Mailer
- Active Support
- Active Resource
- Action WebServices (1.2.6)
40
Rails - instalando
•O Rails é uma RubyGem
•Uma gem é código ruby empacotado
41
[tulios] ~ gem -v1.3.6
Rails - instalando
• gem install rails
•Vamos utilizar o SQLite3
- gem install sqlite3-ruby (driver)
42
Rails - instalando
•Verificando a instalação
43
[tulios] ~ gem list
*** LOCAL GEMS ***
actionmailer (2.3.5, 2.3.3, 2.3.2, 2.2.2, 1.3.6)actionpack (2.3.5, 2.3.3, 2.3.2, 2.2.2, 1.13.6)actionwebservice (1.2.6)activerecord (2.3.5, 2.3.3, 2.3.2, 2.2.2, 1.15.6)activeresource (2.3.5, 2.3.3, 2.3.2, 2.2.2)activesupport (2.3.5, 2.3.3, 2.3.2, 2.2.2, 1.4.4)rack (1.0.0)rails (2.3.5, 2.3.3, 2.3.2, 2.2.2, 1.2.6)rake (0.8.7, 0.8.3)sqlite3-ruby (1.2.5, 1.2.4)
[tulios] ~ rails -vRails 2.3.5
[tulios] ~ sqlite3 --version3.6.12
Rails - criando o projeto
• Abra o terminal e utilize o comando:
- rails <nome do projeto>
• O Rails irá gerar o arcabouço de um projeto MVC
44
[tulios] ~ rails bug_tracking create create app/controllers create app/helpers create app/models create app/views/layouts
...
Rails - criando o projeto
•Vamos subir o servidor
- ruby script/server
- Acessar a URL http://localhost:3000
45
[tulios] ~/exemplo/bug_tracking ruby script/server => Booting Mongrel=> Rails 2.3.4 application starting on http://0.0.0.0:3000=> Call with -d to detach=> Ctrl-C to shutdown server
Rails - criando o projeto
• Página de início
46
Rails - o projeto
•Analisaremos apenas o diretório APP, por enquanto
47
Controllers- Controladores da aplicação
Models- Os modelos do seu domínio
Views- As telas
Helpers- Classes de ajuda
Rails - scripts
•Generate
- Cria uma estrutura básica para o modelo
• Server
- Inicia o servidor da aplicação
•Modo de usar:
- ruby script/generate <parâmetros>
- ruby script/server <parâmetros>
48
Rake
• Semelhante ao make do C/C++ ou Ant do Java
• “A simple ruby build program with capabilities similar to make.”
49
[tulios] ~ rake --versionrake, version 0.8.7
Rails - o projeto
•Configuração padrão do banco
- O banco padrão é o SQLite3, que é um banco de dados embarcado
50
Rails - o projeto
•Configuração padrão do banco
51
Rails - 1º CRUD
•Vamos utilizar o gerador scaffold (andaime)
- ruby script/generate scaffold project name:string description:text owner:string
- Os atributos do modelo são passados no script
52
Rails - 1º CRUD
• Saída do scaffold
53
exists app/models/exists app/controllers/exists app/helpers/create app/views/projectsexists app/views/layouts/...create db/migratecreate db/migrate/20091018202745_create_projects.rb
Rails - 1º CRUD
•Vamos terminar a criação do modelo
• Execute os comandos:
- rake db:create:all
- rake db:migrate
54
Rails - 1º CRUD
• Saída do db:migrate
55
[tulios] ~ exemplo/bug_tracking rake db:migrate(in /Users/tulios/Documents/SEA/Palestras/Rails/exemplo/bug_tracking)== CreateProjects: migrating ==============================-- create_table(:projects) -> 0.0016s== CreateProjects: migrated (0.0017s) =======================
Migrations (migrações) são uma forma de evoluir o schema do banco de dados
Rails - 1º CRUD
•Acesse
- http://localhost:3000/projects
56
Rails - 1º CRUD
• O que fizemos?
- db:migrate evoluiu o banco de dados, aplicando a migrate criada
57
Rails - 1º CRUD
•Analisando a migration criada
58
20091018202745_create_projects.rb
Data Tipo Alvo
2009/10/18 20:27:45
Rails - 1º CRUD
•Código da migration
59
Rails - 1º CRUD
•Código do modelo
60
As colunas do banco serão injetadas como atributos pelo Active Record
Rails - 1º CRUD
• Active Record
• Vejamos alguns métodos herdados
- save
- find(id)
- find(:all) / (:first) / (:last)
• Parâmetros opcionais:
:conditions, :join, :order, :limit, :offset, :select, :readonly, :from, :group, :lock ...
61
Rails - 1º CRUD
•Active Record
•Mais métodos...
- update_attributes(hash)
- destroy
- find_by_sql(string)
62
Rails - 1º CRUD
•Active Record
•Dinamic finders
- find_all
- find_all_by_name(name)
- find_all_by_name_and_age(name, age)
- etc
63
Rails - 1º CRUD
• Vamos testar => ruby script/console
64
[tulios] ~ exemplo/bug_tracking ruby script/console Loading development environment (Rails 2.3.4)
>> Project.all=> [#<Project id: 1, name: "Nome do projeto", description: "A descrição do projeto", owner: "Dono do projeto", created_at: "2009-10-18 22:09:45", updated_at: "2009-10-18 22:09:45">]
>> Project.find_all_by_name("Nome do projeto")=> [#<Project id: 1, name: "Nome do projeto", description: "A descrição do projeto", owner: "Dono do projeto", created_at: "2009-10-18 22:09:45", updated_at: "2009-10-18 22:09:45">]
>> Project.count=> 1
Rails - 1º CRUD
•Código do controlador (index)
65
Rails - 1º CRUD
• Index no formato xml
• http://localhost:3000/projects.xml
66
Rails - 1º CRUD
•Código do controlador (show)
67
Params é um hash do Rails que possui todos os atributos do request. :id é o identificador do atributo id
Rails - 1º CRUD
•Código do controlador (new/edit)
68
Rails - 1º CRUD
•Código do controlador (create)
69
Rails - 1º CRUD
•O flash é um hash que é apagado na próxima requisição, por isso ele é muito útil em guardar mensagens de sucesso, erro, etc.
70
Rails - 1º CRUD
•Código do controlador (update)
71
Rails - 1º CRUD
•Código do controlador (destroy)
72
Rails - 1º CRUD
•Configuração das rotas
73
Rails - 1º CRUD
•Views
74
Nesse caso temos um layout para o controlador projects, mas poderiamos ter apenas um layout para aplicação toda.
application.html.erb
Rails - 1º CRUD
• projects.html.erb
75
Rails - 1º CRUD
•Onde ficam os css e javascripts?
76
stylesheet_link_tag facilita o acesso aos arquivos css
:defaults carrega todos os arquivos javascript padrão do Rails
Rails - 1º CRUD
• index.html.erb
77
<% para executar algum comando e <%= para escapar algum valor
Rails - 1º CRUD
•Método helper H
•Caso contrário
78
Não permite a execução do html armazenado
Rails - 1º CRUD
• Resultado
- Com
- Sem
79
Rails - 1º CRUD
•Vamos incrementar o modelo
•Vamos utilizar:
- validates_
•O que vamos validar:
- nome será obrigatório, maior que 5 e menor que 50
- responsável será obrigatório
80
Rails - 1º CRUD
•Novo código do modelo
81
Rails - 1º CRUD
•Resultado
82
Rails - 1º CRUD
•Outros métodos validates_
83
Rails - 1º CRUD
•Validação personalizada
84
Rails
•Relacionamentos entre tabelas
- 1 para 1
85
Rails
•Relacionamentos entre tabelas
- 1 para N
86
Rails
•Relacionamentos entre tabelas
- N para N
87
Rails - 2º CRUD
•Um Projeto possui vários Bugs
- ruby script/generate scaffold bug project:belongs_to description:text
88
Rails - 2º CRUD
•Vamos validar, para que project não seja nulo
89
Rails - 2º CRUD
•Aplicando as mudanças
- rake db:migrate
90
[tulios] ~ exemplo/bug_tracking rake db:migrate(in /Users/tulios/Documents/SEA/Palestras/Rails/exemplo/bug_tracking)== CreateBugs: migrating ===============================-- create_table(:bugs) -> 0.0018s== CreateBugs: migrated (0.0020s) ========================
Rails - 2º CRUD
•Um projeto poderá ter vários bugs
91
Rails - 2º CRUD
•Vamos criar rotas relacionadas
- config/routes.rb
- A rota direta para bug foi removida
92
http://localhost:3000/projects/5/bugs/new
Rails - 2º CRUDO
• Podemos pedir para o rake informar todas as rotas
- rake routes
93
Rails - 2º CRUD
•Vamos adicionar o link de novo bug em projeto
- project/show.html.erb
94
Rails - 2º CRUD
•Vamos corrigir bug/new.html.erb
95
Rails - 2º CRUD
• bugs_path não existe, devemos corrigir o link voltar também
96
Rails - 2º CRUD
•Vamos ajustar a criação
- Método create
97
Rails - 2º CRUD
•Resultado
- http://localhost:3000/projects/5
- http://localhost:3000/projects/5/bugs/new
98
Rails - 2º CRUD
• Vamos apenas melhorar a apresentação
- projects/show.html.erb
99
Rails - 2º CRUD
•Configurar a página principal
- apague public/index.html
- mapeamento no config/routes.rb
100
Que aprender mais?
101
http://www.pragprog.comhttp://www.urubatan.com.br
102
P&Rhttp://twitter.com/tuliosornelas.tulio@gmail.com
http://github.com/tulios