dando os primeiros passos com rails
DESCRIPTION
Palestra que aborda tópicos simples de Ruby, questões básicas de Rails à itens mais avançados como mass assignment, nested attributesTRANSCRIPT
globo.comDando os primeiros passos com rails
Marcos Sousa@[email protected]
globo.com Rails do básico ao avançado
Marcos SousaDesenvolvedor por paixão
7 anos de experiência
Java, Ruby, Javascript, SQL
Piloto de F1 nas horas vagas :)
Scrum Master
Isso mesmo! SQL!
globo.com Rails do básico ao avançado
...construindo pixel a pixel o maior portal
brasileiro de internet
globo.com Rails do básico ao avançado
Começando com rubyHistór ico
globo.com Rails do básico ao avançado
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
Histór ico
globo.com Rails do básico ao avançado
CaracterísticasPropósitos e Objetivos
globo.com Rails do básico ao avançado
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
Propósitos e Objetivos
globo.com Rails do básico ao avançado
Já vem instalado
instalação via apt-get, yum, rvm, etc
one click installhttp://rubyinstaller.org/downloads/
Instalação
globo.com Rails do básico ao avançado
O Básico de RubyMétodos bás icos
globo.com Rails do básico ao avançado
“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
Comandos bás icos
globo.com Rails do básico ao avançado
def say_hello "Hello dear #{yield}"end
person = "Vanessa"
puts say_hello { person }
Clousures com proc
globo.com Rails do básico ao avançado
module Singer def sing; puts “I’m singing” endend
class Bird << Animal include Singer # ...end
yellow_bird = Bird.newyellow_bird.sing
Modules
globo.com Rails do básico ao avançado
class Person def walk; puts “I’m walking” endendprogrammer = Pesrson.newprogrammer.instance_eval do def code puts “Ruby rocks!” endend programmer.respond_to? :codePesrson.new.respond_to? :code
Ghost c lass
globo.com Rails do básico ao avançado
class Basic def aumount(days); 65.80 * days endend
require “forwardable”class Rental::Car extend Forwardable attr_acessor :type def_delegator :type, :ammountendrental = Bird::Car.new :type => Bird::Type::Basic.newrental.amount(3)
Forwardab le
globo.com Rails do básico ao avançado
class Basic def aumount(days); 65.80 * days endend
class Rental::Car attr_acessor :type delegate :amount, :to => :type, :allow_nil => trueendrental = Bird::Car.new :type => Bird::Type::Basic.newrental.amount(3)
Delegate em ra i l s
globo.com Rails do básico ao avançado
Rails - Básicocr iando app, scaf fo ld ing, ro tas, migra t ion
globo.com Rails do básico ao avançado
$ rails new myinvestiments
cr iando ap l icação
globo.com Rails do básico ao avançado
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
cr iando ap l icação
globo.com Rails do básico ao avançado
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
GET /posts/2/edit posts edit gera o HTML usado para editar um post específico
PUT /posts/2 posts update atualiza os dados de um determinado post
DELETE /posts/2 posts destroy remove um determinado post
REST on ra i l s
globo.com Rails do básico ao avançado
Código Status Verbos HTTP Cenário
200 OK GET/DELETE/PUT
ação executada com sucesso
201 Created POST indica que o conteúdo submetido foi criado
404 Not found GET/DELETE/PUT
indica que não encontrou o recurso informado
406 Not Acceptableo verbo usado não é suportado pelo recurso usado
500Internal Server
error Todosalgum falha foi encontrada durante a execução
REST on Ra i ls
globo.com Rails do básico ao avançado
$ rails g scaffold portifolio_item stock_symbol:string current_price:float
Cr iando CRUD com scaf fo ld
globo.com Rails do básico ao avançado
$ RAILS_ENV=test bundle exec rake spec
Rodando os testes
globo.com Rails do básico ao avançado
validates_presence_of
validates_uniqueness_of
validates_associated
validates_format_of
validates_inclusion_of
validates_length_of
validates_numericality_of
validates_size_of
Validações de modelo
globo.com Rails do básico ao avançado
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
$ rails g model order portifolio_item:references quantity:float unit_price:float tax:float booked_at:datetime traded_at:datetime
Mais um exemplo usando generators
globo.com Rails do básico ao avançado
$ rails g model order portifolio_item:references quantity:float unit_price:float tax:float booked_at:datetime traded_at:datetime
belongs_to
Mais um exemplo usando generators
globo.com Rails do básico ao avançado
Rails - Avançadomass ass ignment , acceptance tests, nest led
a t t r ibutes, a jax, assets p ipe l ine
globo.com Rails do básico ao avançado
Mass assignment
globo.com Rails do básico ao avançado
Mass assignment
globo.com Rails do básico ao avançado
Mass assignment
globo.com Rails do básico ao avançado
Mass assignment
globo.com Rails do básico ao avançado
Possível usar roles
:as => :admin
Mass assignment
globo.com Rails do básico ao avançado
Possível usar roles
:as => :admin
O update é assim:item.update_attributes(params[:item], :as => :admin)
Mass assignment
globo.com Rails do básico ao avançado
$ rails g rspec:integration portifolio_items
Testes de integração
globo.com Rails do básico ao avançado
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
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']") endend
Exemplo
globo.com Rails do básico ao avançado
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> ...
Nested attributes
globo.com Rails do básico ao avançado
<%= 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>
Ajax in Rails = UJS
globo.com Rails do básico ao avançado
<%= 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?
Ajax in Rails = UJS
globo.com Rails do básico ao avançado
<% if @portifolio.destroyed? %>
$("table").replaceWith(<%=js render :partial => 'portifolio_items/table' %>);
<% else %>
$("#messages").html(<%=js render flash_messages %>)
<% end %>
View de uma requisição rai ls
globo.com Rails do básico ao avançado
<% if @portifolio.destroyed? %>
$("table").replaceWith(<%=js render :partial => 'portifolio_items/table' %>);
<% else %>
$("#messages").html(<%=js render flash_messages %>)
<% end %>
A resposta é um arquivo Javascript!
View de uma requisição rai ls
globo.com Rails do básico ao avançado
$ bundle exec rake assets:precompile
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
globo.com Rails do básico ao avançado
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
Fazendo o deploy
globo.com Rails do básico ao avançado
What’s next??