112
Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps

Desenvolvimento web com Ruby on Rails (parte 1)

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Desenvolvimento web com Ruby on Rails (parte 1)

Desenvolvimento Web com Ruby on

Rails

João Lucas Pereira de Santanagtalk | linkedin | twitter: jlucasps

Page 2: Desenvolvimento web com Ruby on Rails (parte 1)

Agenda

● Origem do framework● Por que aprender Ruby on Rails● A linguagem Ruby● Ruby on Rails full stack● Aplicação Básica● Versionamento com Git● Configuração de Assets● Deploy na Heroku

@jlucasps

Page 3: Desenvolvimento web com Ruby on Rails (parte 1)

Origem

@jlucasps

Open source desde 2004David Heinemeier Hansson

Page 4: Desenvolvimento web com Ruby on Rails (parte 1)

Origem

@jlucasps

Rails Core Team

Jeremy Kemper Michael Koziarski Yehuda Katz José Valim

Santiago Pastorino Aaron Patterson Xavier Noria Jon Leighton

Rafael França Andrew White Guillermo Iguaran Carlos Antonio

Page 5: Desenvolvimento web com Ruby on Rails (parte 1)

OrigemEscrito em RubyYukihiro Matsumoto

@jlucasps

Page 6: Desenvolvimento web com Ruby on Rails (parte 1)

TestesTestes

Testes

Origem

Framework para desenvolvimento de apps Web seguindo o padrão MVC (Model-View-Controller)

@jlucasps

Model View

ControllerHTTP/SSL

Routes

Helpers

Middleware

Responders

Renders

Session

Logs

Associations

Validations

Queries

Callbacks

Connections

Migrations

Assets

Helpers

Builders

Templates

Partials

Page 7: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

O que vocês me dizem?

@jlucasps

Page 8: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

@jlucasps

● Tecnologia○ Implementado na Linguagem Ruby○ Linguagem Interpretada○ Orientada a Objetos○ Sintaxe bastante inspirada em Perl e Lisp

Page 9: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby foi desenvolvida por Yukihiro ‘Matz’ Matsumoto, e lançada em 1995É uma linguagem Orientada a Objetos de tipagem forte e dinânimaCaracterísticas principais:

Por que aprender Ruby on Rails?

@jlucasps

Simplicidade do código

escrito

Poder do código gerado

Page 10: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Ruby foi construída com base em duas simples idéias:

@jlucasps

O código deve ser bastante claro

O código deve ser conciso

Código simples, efetivo e fazer exatamente o que ele se propõe a fazer.

Page 11: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Ruby foi pensada para ser uma linguagem divertida de usar (joy to use)

@jlucasps

Page 12: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

● Além de uma linguagem de muito alto nível;

● Ruby é extremamente poderosa;● Versátil;● Mantendo um equilíbrio entre clareza e

performance.

@jlucasps

Page 13: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

O primeiro interpretador para Ruby (MRI - Matz’s Ruby Interpreter) foi escrito em C.Atualmente existem versões compatíveis com outras plataformas:

@jlucasps

Page 14: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

● Estrutura do framework○ Camada de persistência independente

@jlucasps

Page 15: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

● Conventions over Configurations (CoC)

@jlucasps

Page 16: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Segue o padrão MVC

@jlucasps

Model View

Controller

Separação de interesses entre as

camadas da aplicação

Isolamento das regras de negócio,

evitando duplicação e facilitando a

manutenção do código

Amplamente conhecido

Page 17: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

@jlucasps

Model View

Controller

Model

Representa as entidades:

Document, User, Account, Picture

encapsula as regras de negócio

específicas da sua aplicação

extensões de ActiveRecord::Base

representam entradas do banco de dados acoplados com

definições das regras do negócio

Page 18: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

@jlucasps

Model View

Controller

Controller

Responder a requisições HTTP

enviadas ao servidor

retornar arquivos HTML para o

usuário que efetuou a requisição

XML, JSON, PDF, JavaScript

manipulam MODELS e renderizam VIEWS com objetivo

de gerar uma resposta apropriada ao usuário.

Page 19: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

@jlucasps

Model View

Controller

View

Arquivos HTML com código Ruby

embutido (Embedded Ruby - .erb

files)

Fornecem uma apresentação apropriada das entidades da

sua aplicação

Haml, JavaScript

Page 20: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

● Implementação RESTful (Representational State Transfer)○ Mecanismos para facilitar a implementação das

regras de negócios, representando-as como transições de estados das entidades do sistema

○ Login/logout da gem Devise: ■ create session■ destroy session

@jlucasps

Page 21: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Gerenciador de dependências Bundler

@jlucasps

Assegura quais versões são necessárias para

sua aplicação, bem como resolução de

dependência entre elas

Page 22: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Dependências em uma aplicação simples

@jlucasps

Page 23: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Testes automatizados

@jlucasps

Page 24: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

● Configurações de DEV, TST, STG, PRD● Deploy

@jlucasps

Page 25: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?

Valor de Negócio

@jlucasps

+ foco no negócio- código

Rápida resposta a mudanças no negócio

Page 26: Desenvolvimento web com Ruby on Rails (parte 1)

Por que aprender Ruby on Rails?Muitas gems, mas muitas mesmorubygems.org e ruby-toolbox.com

@jlucasps

jquery-rails

pg

mailcatcherdevise

aws-sdkfriendly_id

rmagick

delayed_jobjquery-fileupload-rails

tiny-mce

will_paginate

meta-search

i18n-js

i18n

guard-test

lol-dba

capybara

rspec

factory-girl

simple-cov

better_errors

Page 27: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem RubyAbra o terminal e execute o interpretador Ruby

@jlucasps

$ irb-ruby-1.9.3-p392

irb(main):001:0>

Entre com algum comando e pressione enter

para que seja executado.

irb(main):001:0> 4 + 6

=> 10

Page 28: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

Observe que o interpretador reconhece números e expressões matemáticas.

@jlucasps

irb(main):002:0> 10 / 5=> 2

irb(main):003:0> 8 * 2=> 16

irb(main):004:0> (57 - 4) * (3 * 9)

=> 1431

irb(main):005:0> 3 ** 2=> 9

irb(main):006:0> 5 / 2=> 2

Page 29: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

irb(main):007:0> "João Lucas"

=> "João Lucas"

Vamos avaliar alguns valores em forma de textoDigite seu nome no interpretador entre aspas (”).

Agora vamos verificar algumas funções existentes em objetos desse tipo.

irb(main):020:0> "João Lucas".reverse

=> "sacuL oãoJ"

Page 30: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Teste outros métodos existentes em objetos String

irb(main):021:0> "João Lucas".length

=> 10

irb(main):024:0> " abc " + " 123 "

=> " abc 123 "

irb(main):026:0> "Hey Jude, " + "na "*3=> "Hey Jude, na na na "

irb(main):029:0> "João Lucas".upcase

=> "JOãO LUCAS"

irb(main):030:0> "João Lucas".downcase

=> "joão lucas"

Page 31: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

irb(main):034:0> "está ficando legal isso aqui".capitalize

=> "Está ficando legal isso aqui"

irb(main):036:0> "está ficando legal isso aqui".split

=> ["está", "ficando", "legal", "isso", "aqui"]irb(main):037:0> "está ficando legal isso aqui".split('l')

=> ["está ficando ", "ega", " isso aqui"]irb(main):038:0> "está ficando legal isso aqui".split('a')

=> ["está fic", "ndo leg", "l isso ", "qui"]

Page 32: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

E o que acontece se tentarmos executar em

números alguns métodos existentes em Strings?

irb(main):039:0> 40.reverse

Qual a resposta exibida?

NoMethodError: undefined method `reverse' for 40:Fixnum

from (irb):39

from /home/jlucasps/.rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'

Page 33: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

E para o comando:

irb(main):040:0> "40".reverse

Você consegue explicar por que a saída é:

irb(main):040:0> "40".reverse

=> "04"

Page 34: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Nem todos os objetos Ruby implementam os mesmos métodos.

No entanto, existe a possibilidade de converter objetos de um tipo para outro.

irb(main):042:0> 40 + 10

=> 50

irb(main):044:0> 40.to_s + 10.to_s

=> "4010"

Page 35: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

O interpretador também permite trabalharmos com listas (Arrays)

irb(main):047:0> [2, 4, 6, 8, 10]=> [2, 4, 6, 8, 10]

Listas também possuem algumas funções interessantesirb(main):048:0> [2, 4, 6, 8, 10].min

=> 2

irb(main):049:0> [2, 4, 6, 8, 10].max

=> 10

Page 36: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

E se não quisermos ter o trabalho de repetir todos esses números a cada execução?

irb(main):053:0> even = [2, 4, 6, 8, 10]=> [2, 4, 6, 8, 10]irb(main):054:0> even.min

=> 2

Basta armazenarmos em uma variável

Page 37: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Armazenando os objetos em variáveis, podemos trabalhar mais facilmenteirb(main):056:0> even.shuffle

=> [10, 4, 2, 8, 6]irb(main):058:0> even = even.shuffle

=> [2, 8, 6, 4, 10]irb(main):059:0> even.sort

=> [2, 4, 6, 8, 10]irb(main):089:0> even.push(12)

=> [2, 8, 6, 4, 10, 12]irb(main):090:0> even[6] = 14

=> 14

irb(main):103:0> even

=> [2, 8, 6, 4, 10, 12, 14]

Page 38: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Alguém sabe porquê o método pop funciona de modo diferente para uma lista em ordem normal e uma lista em ordem reversa?irb(main):103:0> even

=> [2, 8, 6, 4, 10, 12, 14]irb(main):104:0> even.pop

=> 14

irb(main):106:0> even

=> [2, 8, 6, 4, 10, 12]irb(main):107:0> even.reverse.pop

=> 2

irb(main):108:0> even

=> [2, 8, 6, 4, 10, 12]

Page 39: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

A explicação pode ser encontrada executando o

código abaixo

irb(main):110:0> even.object_id

=> 8472880

irb(main):111:0> even.reverse.object_id

=> 9555820

Page 40: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

E se quisermos substituir uma pequena parte de um texto maior?

irb(main):070:0> text = "Ticking away the moments that make up a dull day. You

fritter and waste the hours in an off hand way"

=> "Ticking away the moments that make up a dull day. You fritter and waste the

hours in an off hand way"

irb(main):071:0> text["dull"] = "great"

=> "great"

irb(main):072:0> text

=> "Ticking away the moments that make up a great day. You fritter and waste the

hours in an off hand way"

Page 41: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Um característica interessante da implementação de Ruby é a fácil leitura do código

=> "Kicking around on a piece of ground in your home town"

irb(main):076:0> text.include?("home")

=> trueirb(main):077:0> text.include?("my home")

=> falseirb(main):084:0> text.include? "black"

=> true

Page 42: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Além de números, Strings e Arrays, quais outras estruturas de dados temos em Ruby?

irb(main):086:0> songs = {}

=> {}

O processo de inserção de valores em um Hash é semelhante a inserção em Arraysirb(main):114:0> songs[:good] = "Stairway to Heaven"

=> "Stairway to Heaven"

irb(main):115:0> songs[:horrible] = "Boquinha da garrafa"

=> "Boquinha da garrafa"

Page 43: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Agora vamos conhecer outras estruturas não

muito conhecidasirb(main):129:0> all = ""

=> ""

irb(main):134:0> songs.values.each {|value| all += value + ", " }

=> ["Stairway to Heaven", "Boquinha da garrafa"]irb(main):135:0> all

=> "Stairway to Heaven, Boquinha da garrafa, "

Page 44: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Acabamos de usar uma estrutura chamada Block. Vamos executar um outro teste mais simples, para facilitar a visualização

irb(main):136:0> 5.times {puts "ihhhhrrrraaaaa"}

ihhhhrrrraaaaa

ihhhhrrrraaaaa

ihhhhrrrraaaaa

ihhhhrrrraaaaa

ihhhhrrrraaaaa

=> 5

Page 45: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Nos exemplo anteriores, usamos uma estrutura não muito comum para identificar as chaves do Hash, chamada Symbol.

Symbols são criados utilizando-se as sintaxes :

name ou :”name”

Um mesmo Symbol será criado para um dado nome enquanto durar a execução do programa, independente do contexto.

Page 46: Desenvolvimento web com Ruby on Rails (parte 1)

@jlucasps

A linguagem Rubymodule One class Fred end $f1 = :Fredendmodule Two Fred = 1 $f2 = :Fredenddef Fred()end$f3 = :Fredirb(main):186:0> $f1.object_id=> 463148irb(main):187:0> $f2.object_id=> 463148irb(main):188:0> $f3.object_id=> 463148

Page 47: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Por enquanto, trabalhamos apenas com objetos existentes na linguagem Ruby. E se precisarmos criar nossos próprios objetos?

Para criar objetos, precisamos implementar classes.

Classes são estruturas que definem quais infomormaçãoes serão armazenadas nos objetos, a quais métodos devem responder e quais os comportamentos.

Page 48: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

class Document attr_accessor :title, :author, :content

def initialize(title, author, content)

@title = title

@author = author

@content = content

end def words @content.split

end def word_count words.size

endend

Page 49: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Execute o interpretador ruby no mesmo diretório onde o arquivo foi salvo

$ irb-ruby-1.9.3-p392

Importe o arquivo para que ele seja lido pelo interpretador e fique disponível para utilização

irb(main):001:0> require './document'

=> true

Page 50: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Definimos a classe Document com algumas informações e comportamentos.

Em linguagens Orientadas a Objetos, as classes servem como “fabricantes”, ou “moldes” de objetos, é a partir delas que os objetos são criados.

Além disso, as classes definem quais as informações, ou atributos, os objetos criados a partir daquela classe devem ter.

Page 51: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Os atributos são definidos pela instrução

...

attr_accessor :title, :author, :content

...

O termo attr_accessor é uma abreviação para

‘attribute accessor’, que define que os atributos

serão acessíveis nos objetos daquela classe

Page 52: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Nossa classe Document também define três métodos, e um deles tem um comportamento especial.

Em Ruby, o construtor é sempre o método initialize.

Na nossa implementação, precisamos de três

informações para criar objetos do tipo

Document, são elas: title, author, content.

Page 53: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Além do construtor, definimos outros dois métodos (words e word_count) na classe Document.

Estes métodos são responsáveis por implementar comportamentos adicionais dos objetos do tipo Document.

Page 54: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Para instruirmos a classe Document a criar objetos, executamos uma chamada ao construtor e passamos as informações requeridas.

irb(main):002:0> doc = Document.new "Ruby Tutorial", "Joao Lucas", "This is a content of document."=> #<Document:0x00000001074968 @title="Ruby Tutorial", @author="Joao Lucas", @content="This is a content of document.">

Page 55: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Uma vez que o objeto está instanciado, podemos

acessar seus atributos e executar seus métodos.

irb(main):007:0> doc.words=> ["This", "is", "a", "content", "of", "document."]irb(main):008:0> doc.word_count=> 6irb(main):009:0> doc.title=> "Ruby Tutorial"irb(main):010:0> doc.author=> "Joao Lucas"

Page 56: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Agora vamos adicionar um atributo created_at e

definicar seu valor no momento de criação do

objeto.

Além disso, vamos criar um método que retorne o documento completo, contento título, conteúdo, autor e data de criação.

Page 57: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

class Document attr_accessor :title, :author, :content attr_reader :created_at def initialize(title, author, content) @created_at = Time.now @title = title @author = author @content = content end def words @content.split end def word_count words.size end def full_doc @title + ", by " + @author + ". " + @content + ". At: " + @created_at.to_s endend

Page 58: Desenvolvimento web com Ruby on Rails (parte 1)

A linguagem Ruby

@jlucasps

Basta executarmos o interpretador novamente e importar o arquivo modificado$ irb-ruby-1.9.3-p392

irb(main):001:0> require './document'

=> true

irb(main):002:0> doc = Document.new "Ruby Tutorial", "João Lucas", "This is a content of document"=> #<Document:0x00000000c077b8 @created_at=2013-05-29 04:40:57 -0300, @title="Ruby Tutorial", @author="João Lucas", @content="This is a content of document">irb(main):003:0> doc.full_doc=> "Ruby Tutorial, by João Lucas. This is a content of document. At: 2013-05-29 04:40:57 -0300"irb(main):004:0>

Page 59: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

request

response

Page 60: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

O que é um request?

é um conjunto de instruções que diz ao servidor qual tipo de resposta é esperada

Page 61: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

http://myapp.com/users/2/lists

request path: http://myapp.com/users/2/lists

request url:

request verb: GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

query data: http://myapp.com/users?page=5

header data:

Page 62: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

header data:

Page 63: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Browser para o Web Server

Model View

Controller

Web Server

App ServerR

ails

Page 64: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

http://myapp.com/users/2/lists

Page 65: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

REQUEST: GET http://myapp.com/users/2/lists

Page 66: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

um software que entrega páginas web para um request usando o protocolo HTTP

O que é um Web Server?

hospeda aplicações e gerencia a entrega de conteúdo dessas aplicações

WEBRick

Page 67: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

REQUEST: GET http://myapp.com/users/2/lists

Web Server para o App Server

ACCEPTED: passado para o App Server

Page 68: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

O que é um App Server?

software que gerencia a execução de programas, rotinas, scripts para uma

aplicação

responsável por inicializar o Rails

Apache Phusion Passenger

Apache Tomcat

thin mongrel

Page 69: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Rails

Model View

Controller

Web Server

App Server

Rai

ls

REQUEST: GET http://myapp.com/users/2/lists

ACCEPTED: passado para o App Server

Request passado para o Rails

Page 70: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Rai

ls

Router

Rails

Page 71: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Router

Page 72: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Router

Page 73: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Router

Page 74: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Router

user_lists GET /users/:user_id/lists(.:format) lists#index

Controller e Action selecionadas:

GET /users/2/lists

CONTROLLER: "lists"

ACTION: "index"

NOME DA ROTA: "user_lists"

Page 75: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Router

Page 76: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Rai

ls

Router

Controller

Controller

Model View

Action Action Action

Action Action Action

GET /users/2/listsCONTROLLER: "lists"ACTION: "index"

Page 77: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Rai

ls

Router

Controller

ListsController

Model View

index new create

update destroy ........

GET /users/2/listsCONTROLLER: "lists"ACTION: "index"

Page 78: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Controller Action

Page 79: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model

Convetions over Configurations

Page 80: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model

@user = User.find(params[:user_id])@lists = List.find_all_by_user_id(params[:user_id])

ListsControllerindex new create

update destroy ........

UserModel

ListModel

ActiveRecord

ActiveRecord

Banco de dados

tabela 'users'

tabela 'lists'

Page 81: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

REQUEST: GET http://myapp.com/users/2/lists

ACCEPTED: passado para o App Server

REQUEST passado para o Rails

PATH e METHOD mapeados para CONTROLLER e ACTION

CONTROLLER recupera informações dos MODELS para suprir a VIEW

Model View

Controller

Web Server

App Server

Rai

ls

Router

action action action

Page 82: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

View

ListsController

index

update

View

app/views/lists/index.html.erb

edit

..........

app/views/lists/update.html.erb

@vars

.html

@vars

.html

Request HeadersAccept: text/html, application/xhtml+xml

Page 83: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

HTTP Response

Page 84: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

HTTP Response

● 1xx Informational - Request received, continuing process.

● 2xx Success - The action requested by the client was received, understood, accepted and processed successfully.

● 3xx Redirection - The client must take additional action to complete the request.

● 4xx Client Error - The 4xx class of status code is intended for cases in which the client seems to have erred.

● 5xx Server Error - The server failed to fulfill an apparently valid request.

Page 85: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

HTTP Response

Page 86: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

REQUEST: GET http://myapp.com/users/2/lists

ACCEPTED: passado para o App Server

REQUEST passado para o Rails

PATH e METHOD mapeados para CONTROLLER e ACTION

CONTROLLER recupera informações dos MODELS para suprir a VIEW

Model View

Controller

Web Server

App Server

Rai

ls

Router

action action action

VIEW cria a resposta para o RESPONSE BODY

Page 87: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

Router

action action action

VIEW cria a resposta para o RESPONSE BODY

RESPONSE volta através do middleware stack

RESPONSE é retornada para o browser

RESPONSE recebida :-)

Page 88: Desenvolvimento web com Ruby on Rails (parte 1)

Ruby on Rails full stack

@jlucasps

Response

Page 89: Desenvolvimento web com Ruby on Rails (parte 1)

@jlucasps

Aplicação Básica

● Ferramentas para desenvolvimento○ IDE's (Integrated Development Environment)

Page 90: Desenvolvimento web com Ruby on Rails (parte 1)

@jlucasps

Aplicação Básica

● Ferramentas para desenvolvimento○ IDE's (Integrated Development Environment)

Page 91: Desenvolvimento web com Ruby on Rails (parte 1)

@jlucasps

Aplicação Básica

● Ferramentas para desenvolvimento○ IDE's (Integrated Development Environment)

Page 92: Desenvolvimento web com Ruby on Rails (parte 1)

@jlucasps

Aplicação Básica

● Ferramentas para desenvolvimento○ IDE's (Integrated Development Environment)

Page 93: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Editores de texto○ Sublime Text 2

Page 94: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Editores de texto

Page 95: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Terminal / console○ iTerm, Konsole, Gnome-Terminal

Page 96: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Terminal / console

Page 97: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Browsers

Antigos

Page 98: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Gerenciamento de código

Page 99: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

● Gerenciamento de versões e código

CVS (Concurrent Version System)

Page 100: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

Rubygems Rails

● Core

Ruby

Page 101: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

jlucasps@lotus:/media/truecrypt1/handsonrails$ rails new first_app create create README.rdoc create Rakefile create config.ru create .gitignore create Gemfile....

Using sqlite3 (1.3.7)Installing uglifier (2.1.1)Your bundle is complete!Use `bundle show [gemname]` to see where a bundled gem is installed.jlucasps@lotus:/media/truecrypt1/handsonrails$

Page 102: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

jlucasps@lotus:/media/truecrypt1/handsonrails$ cd first_app jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails server

jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails server/home/jlucasps/.rvm/gems/ruby-1.9.3-p392/gems/execjs-1.4.0/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

Caso ocorra erro Javascript Runtime

# See https://github.com/sstephenson/execjs#readme ....gem 'therubyracer', :platforms => :ruby

Adicionar a gem therubyracer ao Gemfile

Page 103: Desenvolvimento web com Ruby on Rails (parte 1)

Aplicação Básica

@jlucasps

app/ Código da aplicação, incluindo models, views, controllers e helpers.app/assets Assets da aplicação, tais como CSS's, JavaScripts, imagens e fontes.config/ Configurações da aplicaçãodb/ Configurações dos bancos de dadosdoc/ Documentação da aplicaçãolib/ Bibliotecas utilizadas pela aplicaçãolib/assets Assets utilizados pelas bibliotecas da aplicaçãolog/ Logs da aplicaçãopublic/ Conteúdos de acesso público (páginas de errors)script/rails Script para executar generators, iniciar servidor local, iniciar rails consoletest/ Suite de testes da aplicação (substituído pelo spec/ quando utilizado RSpec)tmp/ Arquivos temporáriosvendor/ Códigos de terceiros que devem estar junto com a aplicaçãovendor/assets Assets fornecidos por terceiros (plugins jQuery, Javascript, CSS's, imagens)README.rdoc Breve descrição da aplicaçãoRakefile Configuração para execução de rake tasks da aplicaçãoGemfile Gems necessárias para a aplicaçãoGemfile.lock Lista detalhada de todas as dependências da aplicaçãoconfig.ru Configuração para servidores que utilizam Rack.gitignore Arquivos e diretórios a serem ignorados pelo Git

Page 104: Desenvolvimento web com Ruby on Rails (parte 1)

Versionamento com Git

@jlucasps

Sistema de controle de versão distribuídoProjetado por Linus Torvalds

PUSH PULL

PUSHPUSH

Page 105: Desenvolvimento web com Ruby on Rails (parte 1)

Versionamento com Git

@jlucasps

diretório$ git add .

$ git commit modificação $ git add .

$ git commit modificação modificação

$ git init

.git/

Page 106: Desenvolvimento web com Ruby on Rails (parte 1)

Versionamento com GitSetup inicial do Git:

$ git config --global user.name "Your Name"

$ git config --global user.email [email protected]

Criar repositório em no diretório atual:$ git init

Editar arquivos que devem ser ignorados:$ sublime .gitignore

Adicionar todos os arquivos ao índice:$ git add .

Verificar status do repositório:$ git status

Fazer commit das modificações:$ git commit -m "message"

Verificar histório de commits:$ git log

@jlucasps

Page 107: Desenvolvimento web com Ruby on Rails (parte 1)

Versionamento com Git

Criar conta no githubAdicionar chave SSH

$ ssh-keygen -t rsa -C "[email protected]"

Enter passphrase (empty for no passphrase): [Type a passphrase]

Enter same passphrase again: [Type passphrase again]

Adicionar repositorio remote e push$ git remote add origin [email protected]:<username>/first_app.git

$ git push -u origin master

Editar README e commit

@jlucasps

Page 108: Desenvolvimento web com Ruby on Rails (parte 1)

Configuração de Assets

Download do Twitter BootstrapMover imagensbootstrap/img/* -> app/assets/images/

Mover arquivos JavaScriptbootstrap/js/bootstrap.js -> app/assets/javascripts/

Mover arquivos de stylesheetsbootstrap/css/bootstrap.css -> app/assets/stylesheets/bootstrap/css/bootstrap-responsive.css -> app/assets/stylesheets/

@jlucasps

Page 109: Desenvolvimento web com Ruby on Rails (parte 1)

Configuração de Assets

Remover app/public/index.htmlCriar app/controllers/welcome_controller.rbCriar action indexAdicionar rota :rootCriar view app/view/welcome/index.html.erbbootstrap.css -> bootstrap.css.erbUtilizar asset_path nas URLs para assets

@jlucasps

Page 110: Desenvolvimento web com Ruby on Rails (parte 1)

Deploy na Heroku

@jlucasps

first_app$ heroku create

Criar conta na Heroku, incluir chave SSH

Adicionar app Rails à sua conta:

Adicionar gem 'pg' ao Gemfile

Adicionar addon heroku-postgresql

first_app$ heroku addons:add heroku-postgresql

Instalar Heroku Toolbet

Page 111: Desenvolvimento web com Ruby on Rails (parte 1)

Deploy na Heroku

@jlucasps

first_app$ git push hereoku master

Deploy da aplicação:

Commitar modificações

Page 112: Desenvolvimento web com Ruby on Rails (parte 1)

Desenvolvimento Web com Ruby on

Rails

João Lucas Pereira de Santanagtalk | linkedin | twitter: jlucasps

Obrigado!