Upload
joao-lucas-santana
View
1.079
Download
6
Embed Size (px)
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 [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
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
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!