dando os primeiros passos com rails

44
globo .com Dando os primeiros passos com rails Marcos Sousa @marcos_sousa www.marcossousa.com [email protected]

Upload: marcos-sousa

Post on 19-Jan-2015

1.363 views

Category:

Technology


9 download

DESCRIPTION

Palestra que aborda tópicos simples de Ruby, questões básicas de Rails à itens mais avançados como mass assignment, nested attributes

TRANSCRIPT

Page 1: Dando os primeiros passos com rails

globo.comDando os primeiros passos com rails

Marcos Sousa@[email protected]

Page 2: Dando os primeiros passos com rails

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!

Page 3: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

...construindo pixel a pixel o maior portal

brasileiro de internet

Page 4: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Começando com rubyHistór ico

Page 5: Dando os primeiros passos com rails

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

Page 6: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

CaracterísticasPropósitos e Objetivos

Page 7: Dando os primeiros passos com rails

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

Page 8: Dando os primeiros passos com rails

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

Page 9: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

O Básico de RubyMétodos bás icos

Page 10: Dando os primeiros passos com rails

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

Page 11: Dando os primeiros passos com rails

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

Page 12: Dando os primeiros passos com rails

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

Page 13: Dando os primeiros passos com rails

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

Page 14: Dando os primeiros passos com rails

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

Page 15: Dando os primeiros passos com rails

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

Page 16: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Rails - Básicocr iando app, scaf fo ld ing, ro tas, migra t ion

Page 17: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

$ rails new myinvestiments

cr iando ap l icação

Page 18: Dando os primeiros passos com rails

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

Page 19: Dando os primeiros passos com rails

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

Page 20: Dando os primeiros passos com rails

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

Page 21: Dando os primeiros passos com rails

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

Page 22: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

$ RAILS_ENV=test bundle exec rake spec

Rodando os testes

Page 23: Dando os primeiros passos com rails

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

Page 24: Dando os primeiros passos com rails

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

Page 25: Dando os primeiros passos com rails

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

Page 26: Dando os primeiros passos com rails

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

Page 27: Dando os primeiros passos com rails

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

Page 28: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Mass assignment

Page 29: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Mass assignment

Page 30: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Mass assignment

Page 31: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Mass assignment

Page 32: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

Possível usar roles

:as => :admin

Mass assignment

Page 33: Dando os primeiros passos com rails

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

Page 34: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

$ rails g rspec:integration portifolio_items

Testes de integração

Page 35: Dando os primeiros passos com rails

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

Page 36: Dando os primeiros passos com rails

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

Page 37: Dando os primeiros passos com rails

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

Page 38: Dando os primeiros passos com rails

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

Page 39: Dando os primeiros passos com rails

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

Page 40: Dando os primeiros passos com rails

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

Page 41: Dando os primeiros passos com rails

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

Page 42: Dando os primeiros passos com rails

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

Page 43: Dando os primeiros passos com rails

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

Page 44: Dando os primeiros passos com rails

globo.com Rails do básico ao avançado

What’s next??