ror na prática

103
Ruby on Rails na prática Túlio Ornelas

Upload: cristiano-s-oliveira-cristianounix

Post on 19-May-2015

556 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: RoR na prática

Ruby on Rails na prática

Túlio Ornelas

Page 2: RoR na prática

2

Page 3: RoR na prática

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

Page 4: RoR na prática

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

Page 5: RoR na prática

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)

Page 6: RoR na prática

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

Page 7: RoR na prática

Um pouco sobre Ruby

• Em Ruby tudo é OO

7

[tulios] ~ irb>> 12.class=> Fixnum

>> true.class=> TrueClass

>> nil.class=> NilClass

>> "Tulio".class=> String

Page 8: RoR na prática

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

Page 9: RoR na prática

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

Page 10: RoR na prática

Um pouco sobre Ruby

•Criando uma classe

- Em Ruby Em Java

10

Page 11: RoR na prática

Um pouco sobre Ruby

•Criando um objeto

- Ruby

- Java

•Note a sintaxe simplificada, não é necessário declarar o tipo da variável.

11

Page 12: RoR na prática

Um pouco sobre Ruby

•Criando uma classe com método

- Ruby Java

12

Page 13: RoR na prática

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!"

Page 14: RoR na prática

Um pouco sobre Ruby

•Utilizando construtores

- Ruby Java

14

Page 15: RoR na prática

Um pouco sobre Ruby

•Analisando

15

- Não é necessário definir o tipo de retorno

- Não é necessário utilizar parênteses ().

Page 16: RoR na prática

Um pouco sobre Ruby

•Construtor e “sobrecarga” do construtor

16

Page 17: RoR na prática

Um pouco sobre Ruby

• Métodos

- De instância

- Da classe

17

Page 18: RoR na prática

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

Page 19: RoR na prática

Um pouco sobre Ruby

•Todo atributo em Ruby é privado!

19

?> user.nomeNoMethodError: undefined method `nome' for #<User:0x101238410 @nome="Tulio"> from (irb):6

Page 20: RoR na prática

Um pouco sobre Ruby

•Métodos de acesso as variáveis

20

Page 21: RoR na prática

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"

Page 22: RoR na prática

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"

Page 23: RoR na prática

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

Page 24: RoR na prática

Um pouco sobre Ruby

•Utilizando a classe em outro .rb

- Importar a classe: require

24

Page 25: RoR na prática

Um pouco sobre Ruby

•Herança

25

Page 26: RoR na prática

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

Page 27: RoR na prática

Um pouco sobre Ruby

•Testando a herança

27

[tulios] ~ irb>> require 'user'=> true

>> Person.superclass=> Object

>> User.superclass=> Person

>> User.superclass.superclass=> Object

Page 28: RoR na prática

Um pouco sobre Ruby

• Loops

- for

28

Page 29: RoR na prática

Exercício

• Imprimir os números impares até 10

29

Page 30: RoR na prática

Exercício

• Solução

30

Page 31: RoR na prática

Um pouco sobre Ruby

•Outros Loops

- while

31

Page 32: RoR na prática

Um pouco sobre Ruby

32

•Outros Loops

- iteradores

Page 33: RoR na prática

Um pouco sobre Ruby

33

•Outros Loops

- métodos da classe Fixnum

Page 34: RoR na prática

Um pouco sobre Ruby

•Array e Hash

34

Page 35: RoR na prática

Um pouco sobre Ruby

• Exceções

35

Page 36: RoR na prática

Um pouco sobre Ruby

•Classes abertas

36

[tulios] ~ irb>> require 'arquivo'=> true

>> 1.impar?=> true>> 3.par?=> false>> 4.par?=> true

Page 37: RoR na prática

Quer aprender mais?

37

http://www.pragprog.com

Page 38: RoR na prática

O que é o Rails?

•Meta-framework MVC

•Desenvolvido em linguagem Ruby

•Baseado em convenções

• http://guias.rubyonrails.pro.br/

38

Page 39: RoR na prática

Rails

• Lançado em julho de 2004

•Criado por David Heinemeir Hansson

•Conceitos

- DRY (Don’t Repeat Yourself)

- Convention over Configuration

39

Page 40: RoR na prática

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

Page 41: RoR na prática

Rails - instalando

•O Rails é uma RubyGem

•Uma gem é código ruby empacotado

41

[tulios] ~ gem -v1.3.6

Page 42: RoR na prática

Rails - instalando

• gem install rails

•Vamos utilizar o SQLite3

- gem install sqlite3-ruby (driver)

42

Page 43: RoR na prática

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

Page 44: RoR na prática

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

...

Page 45: RoR na prática

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

Page 46: RoR na prática

Rails - criando o projeto

• Página de início

46

Page 47: RoR na prática

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

Page 48: RoR na prática

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

Page 49: RoR na prática

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

Page 50: RoR na prática

Rails - o projeto

•Configuração padrão do banco

- O banco padrão é o SQLite3, que é um banco de dados embarcado

50

Page 51: RoR na prática

Rails - o projeto

•Configuração padrão do banco

51

Page 52: RoR na prática

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

Page 53: RoR na prática

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

Page 54: RoR na prática

Rails - 1º CRUD

•Vamos terminar a criação do modelo

• Execute os comandos:

- rake db:create:all

- rake db:migrate

54

Page 55: RoR na prática

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

Page 56: RoR na prática

Rails - 1º CRUD

•Acesse

- http://localhost:3000/projects

56

Page 57: RoR na prática

Rails - 1º CRUD

• O que fizemos?

- db:migrate evoluiu o banco de dados, aplicando a migrate criada

57

Page 58: RoR na prática

Rails - 1º CRUD

•Analisando a migration criada

58

20091018202745_create_projects.rb

Data Tipo Alvo

2009/10/18 20:27:45

Page 59: RoR na prática

Rails - 1º CRUD

•Código da migration

59

Page 60: RoR na prática

Rails - 1º CRUD

•Código do modelo

60

As colunas do banco serão injetadas como atributos pelo Active Record

Page 61: RoR na prática

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

Page 62: RoR na prática

Rails - 1º CRUD

•Active Record

•Mais métodos...

- update_attributes(hash)

- destroy

- find_by_sql(string)

62

Page 63: RoR na prática

Rails - 1º CRUD

•Active Record

•Dinamic finders

- find_all

- find_all_by_name(name)

- find_all_by_name_and_age(name, age)

- etc

63

Page 64: RoR na prática

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

Page 65: RoR na prática

Rails - 1º CRUD

•Código do controlador (index)

65

Page 66: RoR na prática

Rails - 1º CRUD

• Index no formato xml

• http://localhost:3000/projects.xml

66

Page 67: RoR na prática

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

Page 68: RoR na prática

Rails - 1º CRUD

•Código do controlador (new/edit)

68

Page 69: RoR na prática

Rails - 1º CRUD

•Código do controlador (create)

69

Page 70: RoR na prática

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

Page 71: RoR na prática

Rails - 1º CRUD

•Código do controlador (update)

71

Page 72: RoR na prática

Rails - 1º CRUD

•Código do controlador (destroy)

72

Page 73: RoR na prática

Rails - 1º CRUD

•Configuração das rotas

73

Page 74: RoR na prática

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

Page 75: RoR na prática

Rails - 1º CRUD

• projects.html.erb

75

Page 76: RoR na prática

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

Page 77: RoR na prática

Rails - 1º CRUD

• index.html.erb

77

<% para executar algum comando e <%= para escapar algum valor

Page 78: RoR na prática

Rails - 1º CRUD

•Método helper H

•Caso contrário

78

Não permite a execução do html armazenado

Page 79: RoR na prática

Rails - 1º CRUD

• Resultado

- Com

- Sem

79

Page 80: RoR na prática

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

Page 81: RoR na prática

Rails - 1º CRUD

•Novo código do modelo

81

Page 82: RoR na prática

Rails - 1º CRUD

•Resultado

82

Page 83: RoR na prática

Rails - 1º CRUD

•Outros métodos validates_

83

Page 84: RoR na prática

Rails - 1º CRUD

•Validação personalizada

84

Page 85: RoR na prática

Rails

•Relacionamentos entre tabelas

- 1 para 1

85

Page 86: RoR na prática

Rails

•Relacionamentos entre tabelas

- 1 para N

86

Page 87: RoR na prática

Rails

•Relacionamentos entre tabelas

- N para N

87

Page 88: RoR na prática

Rails - 2º CRUD

•Um Projeto possui vários Bugs

- ruby script/generate scaffold bug project:belongs_to description:text

88

Page 89: RoR na prática

Rails - 2º CRUD

•Vamos validar, para que project não seja nulo

89

Page 90: RoR na prática

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) ========================

Page 91: RoR na prática

Rails - 2º CRUD

•Um projeto poderá ter vários bugs

91

Page 92: RoR na prática

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

Page 93: RoR na prática

Rails - 2º CRUDO

• Podemos pedir para o rake informar todas as rotas

- rake routes

93

Page 94: RoR na prática

Rails - 2º CRUD

•Vamos adicionar o link de novo bug em projeto

- project/show.html.erb

94

Page 95: RoR na prática

Rails - 2º CRUD

•Vamos corrigir bug/new.html.erb

95

Page 96: RoR na prática

Rails - 2º CRUD

• bugs_path não existe, devemos corrigir o link voltar também

96

Page 97: RoR na prática

Rails - 2º CRUD

•Vamos ajustar a criação

- Método create

97

Page 98: RoR na prática

Rails - 2º CRUD

•Resultado

- http://localhost:3000/projects/5

- http://localhost:3000/projects/5/bugs/new

98

Page 99: RoR na prática

Rails - 2º CRUD

• Vamos apenas melhorar a apresentação

- projects/show.html.erb

99

Page 100: RoR na prática

Rails - 2º CRUD

•Configurar a página principal

- apague public/index.html

- mapeamento no config/routes.rb

100

Page 101: RoR na prática

Que aprender mais?

101

http://www.pragprog.comhttp://www.urubatan.com.br

Page 102: RoR na prática

102