1. globo
.com
Dando os primeiros passos
com rails
Marcos Sousa
@marcos_sousa
www.marcossousa.com
falecomigo@marcossousa.com
2. Marcos Sousa
Desenvolvedor por paixão
7 anos de experiência
Java, Ruby, Javascript, SQL
Isso mesmo! SQL!
Piloto de F1 nas horas vagas :)
globo
.com Rails do básico ao avançado
3. ...construindo pixel a
pixel o maior portal
brasileiro de internet
globo
.com Rails do básico ao avançado
5. Hist óri co
Criado em 1993 por Yukihiro
Primeira lista em inglês 1999
2000 - Programming Ruby - Primeiro livro em inglês
2003 - Início do rails
2004 - Primeiro release público
2010 - Rails 3.0
2011 - Rails 3.1
globo
.com Rails do básico ao avançado
6. Características
Propósitos e Objetivos
globo
.com Rails do básico ao avançado
7. Propósitos e Objetivos
Dinâmica
Linguagem simples e humana
Todas as classes são abertas
Meta programação
Multi-plataforma (Unix/Windows)
Herança simples e mixins
Garbage Collector
globo
.com Rails do básico ao avançado
8. Instalação
Já vem instalado
instalação via apt-get, yum, rvm, etc
one click install
http://rubyinstaller.org/downloads/
globo
.com Rails do básico ao avançado
9. O Básico de Ruby
M é tod os bá sic os
globo
.com Rails do básico ao avançado
10. C o m a nd os b á si c os
“foo”.methods
50.times.each do | i | puts “that’s cool #{i}” end
father.children.map { |child| child.name } ou
father.children.map(&:name)
children_name.join(‘,’)
foo.nil? or self.name.present?
1.day.ago ou 3.years.from_now
globo
.com Rails do básico ao avançado
11. C lo u sure s com p roc
def say_hello
"Hello dear #{yield}"
end
person = "Vanessa"
puts say_hello { person }
globo
.com Rails do básico ao avançado
12. Mod ul es
module Singer
def sing; puts “I’m singing” end
end
class Bird << Animal
include Singer
# ...
end
yellow_bird = Bird.new
yellow_bird.sing
globo
.com Rails do básico ao avançado
13. Gh ost cla ss
class Person
def walk; puts “I’m walking” end
end
programmer = Pesrson.new
programmer.instance_eval do
def code
puts “Ruby rocks!”
end
end
programmer.respond_to? :code
Pesrson.new.respond_to? :code
globo
.com Rails do básico ao avançado
14. Forw a rd a bl e
class Basic
def aumount(days); 65.80 * days end
end
require “forwardable”
class Rental::Car
extend Forwardable
attr_acessor :type
def_delegator :type, :ammount
end
rental = Bird::Car.new :type => Bird::Type::Basic.new
rental.amount(3)
globo
.com Rails do básico ao avançado
15. D e l ega t e em r a ils
class Basic
def aumount(days); 65.80 * days end
end
class Rental::Car
attr_acessor :type
delegate :amount, :to => :type, :allow_nil => true
end
rental = Bird::Car.new :type => Bird::Type::Basic.new
rental.amount(3)
globo
.com Rails do básico ao avançado
16. Rails - Básico
cr ia n do ap p , s ca ffold i ng, rot a s, migrat ion
globo
.com Rails do básico ao avançado
17. c ri and o ap li c açã o
$ rails new myinvestiments
globo
.com Rails do básico ao avançado
18. c ri and o ap li c açã o
group :development, :test do
gem 'rspec-rails'
gem 'capybara', '~> 1.0.0'
gem 'factory_girl', '~> 1.3.3'
gem 'factory_girl_rails'
end
$ rails generate rspec:install
globo
.com Rails do básico ao avançado
19. R E ST on ra il s
HTTP URL Controller action propósito de uso
GET /posts posts index listagem de todos os posts
GET /posts/new posts new gera o HTML usado para criação de um post
POST /posts posts create cria um novo post
GET /posts/2 posts show exibe um determinado post
gera o HTML usado para editar um post
GET /posts/2/edit posts edit
específico
PUT /posts/2 posts update atualiza os dados de um determinado post
DELETE /posts/2 posts destroy remove um determinado post
globo
.com Rails do básico ao avançado
20. R E ST on R ail s
Código Status Verbos HTTP Cenário
GET/DELETE/
200 OK ação executada com sucesso
PUT
201 Created POST indica que o conteúdo submetido foi criado
GET/DELETE/ indica que não encontrou o recurso
404 Not found
PUT informado
o verbo usado não é suportado pelo
406 Not Acceptable
recurso usado
Internal Server algum falha foi encontrada durante a
500 Todos
error execução
globo
.com Rails do básico ao avançado
21. C ri a nd o C RUD c om sca ffold
$ rails g scaffold portifolio_item stock_symbol:string
current_price:float
globo
.com Rails do básico ao avançado
22. R o d a nd o os te ste s
$ RAILS_ENV=test bundle exec rake spec
globo
.com Rails do básico ao avançado
23. Validações de modelo
validates_presence_of validates_length_of
validates_uniqueness_of validates_numericality_of
validates_associated validates_size_of
validates_format_of
validates_inclusion_of
globo
.com Rails do básico ao avançado
24. Testes de validação de modelo com remarkable
should validate_presence_of :stock_symbol
should accept_nested_attributes_for :orders, :accept => { :quantity => 1.0 }
should have_many :orders
should_validate_associated :orders, :builder => proc{ |p| p.orders.build
(:quantity => 100, :unit_price => 23.87) }
should validate_uniqueness_of(:stock_symbol)
should have_scope(:visible, :conditions => {:visible => true})
globo
.com Rails do básico ao avançado
25. Mais um exemplo usando generators
$ rails g model order portifolio_item:references quantity:float
unit_price:float tax:float booked_at:datetime traded_at:datetime
globo
.com Rails do básico ao avançado
26. Mais um exemplo usando generators
$ rails g model order portifolio_item:references quantity:float
unit_price:float tax:float booked_at:datetime traded_at:datetime
belongs_to
globo
.com Rails do básico ao avançado
27. Rails - Avançado
m a s s a s s i g n m e n t, acceptance tests, nestled
at t r i b u t e s , a ja x , a sset s p ip eline
globo
.com Rails do básico ao avançado
32. Possível usar
Mass assignment roles
:as => :admin
globo
.com Rails do básico ao avançado
33. Possível usar
Mass assignment roles
:as => :admin
O update é assim:
item.update_attributes(params[:item], :as => :admin)
globo
.com Rails do básico ao avançado
34. Testes de integração
$ rails g rspec:integration portifolio_items
globo
.com Rails do básico ao avançado
35. Principais métodos
visit new_portifolio_item_path
click_on('New portifolio item') #botões e links
fill_in('Stock symbol', :with => ‘TAMM4’) #caixas de textos
choose('Buy Order') #radio button
check('Scheduled order') #checkbox
select('High risk', :from => 'Items Group') #combobox
have_xpath('//button[@id=”id” and @class=”disabled”]')
have_content('Portifolio item saved successfully')
globo
.com Rails do básico ao avançado
36. Exemplo
context "campanha com apenas formulário de perguntas" do
it "dado que preenche todos os dados vai para página vai para página de edição" do
visita_formulario_da_campanha(@campanha)
page.should have_content("Musas do Brasileirão 2011")
page.should have_xpath("//li[@id='aba_form_1' and contains(@class,'active')]")
fill_in("Nome", :with => "Nicole Bahls")
select("Flamengo", :from => "Time do coração")
click_on('enviar inscrição')
page.should have_content("Parabéns, sua inscrição foi enviada com sucesso!")
page.should have_no_xpath("//input[@id='enviarOutroVideo']")
end
end
globo
.com Rails do básico ao avançado
37. Nested attributes
Permite gerenciar múltiplos modelos dependentes
Baixa complexidade comparado com outras soluções
accepts_nested_attributes_for :orders
<%= f.fields_for do |order| %>
<div class="field">
<%= order.label :quantity %><br />
<%= f.text_field :quantity %>
</div>
...
globo
.com Rails do básico ao avançado
38. Ajax in Rails = UJS
<%= link_to "Destroy", portifolio, :confirm => 'Are you sure?',
:method => :delete, :remote => true
Gera
<a href="/portifolio_item/1" data-confirm="Are you sure?"
data-method="delete" data-remote="true"
rel="nofollow">Destroy</a>
globo
.com Rails do básico ao avançado
39. Ajax in Rails = UJS
<%= link_to "Destroy", portifolio, :confirm => 'Are you sure?',
:method => :delete, :remote => true
Gera
<a href="/portifolio_item/1" data-confirm="Are you sure?"
data-method="delete" data-remote="true"
rel="nofollow">Destroy</a>
Qual é a mágica? Onde está o JS gerado?
globo
.com Rails do básico ao avançado
40. View de uma requisição rails
<% if @portifolio.destroyed? %>
$("table").replaceWith(<%=js render :partial =>
'portifolio_items/table' %>);
<% else %>
$("#messages").html(<%=js render flash_messages %>)
<% end %>
globo
.com Rails do básico ao avançado
41. View de uma requisição rails
<% if @portifolio.destroyed? %>
$("table").replaceWith(<%=js render :partial =>
'portifolio_items/table' %>);
<% else %>
$("#messages").html(<%=js render flash_messages %>)
<% end %>
A resposta é um arquivo Javascript!
globo
.com Rails do básico ao avançado
42. Assets pipeline
Reune e comprime arquivos JS e CSS
Gera fingerprint para os arquivos estáticos
Permite usar CoffeeScript para JS e SaaS para CSS
com ERB
Pode visualizar path no console:
Rails.application.config.assets.paths
$ bundle exec rake assets:precompile
globo
.com Rails do básico ao avançado
43. Fazendo o deploy
Capistrano >= 2.8.0 só adicionar receita no Capfile
load 'deploy/assets'
ou
before :"deploy:symlink", :"deploy:assets"
desc "Compile assets"
task :assets do
run "cd #{realease_path}; RAILS_ENV=#{rails_env} bundle exec
rake assets:precompile"
end
globo
.com Rails do básico ao avançado