Desenvolvimento web com Ruby on Rails (parte 1)

Preview:

DESCRIPTION

 

Citation preview

Desenvolvimento Web com Ruby on

Rails

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

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

Origem

@jlucasps

Open source desde 2004David Heinemeier Hansson

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

OrigemEscrito em RubyYukihiro Matsumoto

@jlucasps

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

Por que aprender Ruby on Rails?

O que vocês me dizem?

@jlucasps

Por que aprender Ruby on Rails?

@jlucasps

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

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

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.

Por que aprender Ruby on Rails?

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

@jlucasps

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

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

Por que aprender Ruby on Rails?

● Estrutura do framework○ Camada de persistência independente

@jlucasps

Por que aprender Ruby on Rails?

● Conventions over Configurations (CoC)

@jlucasps

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

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

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.

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

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

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

Por que aprender Ruby on Rails?

Dependências em uma aplicação simples

@jlucasps

Por que aprender Ruby on Rails?

Testes automatizados

@jlucasps

Por que aprender Ruby on Rails?

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

@jlucasps

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

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

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

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

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"

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"

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

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>'

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"

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"

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

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

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]

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]

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

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"

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

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"

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

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

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.

@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

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.

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

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

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.

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

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.

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.

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

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"

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.

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

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>

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

request

response

Ruby on Rails full stack

@jlucasps

O que é um request?

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

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:

Ruby on Rails full stack

@jlucasps

header data:

Ruby on Rails full stack

@jlucasps

Browser para o Web Server

Model View

Controller

Web Server

App ServerR

ails

Ruby on Rails full stack

@jlucasps

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

Ruby on Rails full stack

@jlucasps

Model View

Controller

Web Server

App Server

Rai

ls

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

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

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

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

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

Ruby on Rails full stack

@jlucasps

Model View

Controller

Rai

ls

Router

Rails

Ruby on Rails full stack

@jlucasps

Router

Ruby on Rails full stack

@jlucasps

Router

Ruby on Rails full stack

@jlucasps

Router

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"

Ruby on Rails full stack

@jlucasps

Router

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"

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"

Ruby on Rails full stack

@jlucasps

Controller Action

Ruby on Rails full stack

@jlucasps

Model

Convetions over Configurations

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'

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

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

Ruby on Rails full stack

@jlucasps

HTTP Response

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.

Ruby on Rails full stack

@jlucasps

HTTP Response

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

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

Ruby on Rails full stack

@jlucasps

Response

@jlucasps

Aplicação Básica

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

@jlucasps

Aplicação Básica

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

@jlucasps

Aplicação Básica

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

@jlucasps

Aplicação Básica

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

Aplicação Básica

@jlucasps

● Editores de texto○ Sublime Text 2

Aplicação Básica

@jlucasps

● Editores de texto

Aplicação Básica

@jlucasps

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

Aplicação Básica

@jlucasps

● Terminal / console

Aplicação Básica

@jlucasps

● Browsers

Antigos

Aplicação Básica

@jlucasps

● Gerenciamento de código

Aplicação Básica

@jlucasps

● Gerenciamento de versões e código

CVS (Concurrent Version System)

Aplicação Básica

@jlucasps

Rubygems Rails

● Core

Ruby

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$

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

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

Versionamento com Git

@jlucasps

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

PUSH PULL

PUSHPUSH

Versionamento com Git

@jlucasps

diretório$ git add .

$ git commit modificação $ git add .

$ git commit modificação modificação

$ git init

.git/

Versionamento com GitSetup inicial do Git:

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

$ git config --global user.email your.email@example.com

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

Versionamento com Git

Criar conta no githubAdicionar chave SSH

$ ssh-keygen -t rsa -C "your_email@example.com"

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 git@github.com:<username>/first_app.git

$ git push -u origin master

Editar README e commit

@jlucasps

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

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

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

Deploy na Heroku

@jlucasps

first_app$ git push hereoku master

Deploy da aplicação:

Commitar modificações

Desenvolvimento Web com Ruby on

Rails

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

Obrigado!