Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Dando os primeiros passos com rails

1,906 views

Published on

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

Published in: Technology
  • Be the first to comment

Dando os primeiros passos com rails

  1. 1. globo .com Dando os primeiros passos com rails Marcos Sousa @marcos_sousa www.marcossousa.com falecomigo@marcossousa.com
  2. 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. 3. ...construindo pixel a pixel o maior portal brasileiro de internetglobo .com Rails do básico ao avançado
  4. 4. Começando com ruby Hist óri coglobo .com Rails do básico ao avançado
  5. 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.1globo .com Rails do básico ao avançado
  6. 6. Características Propósitos e Objetivosglobo .com Rails do básico ao avançado
  7. 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 Collectorglobo .com Rails do básico ao avançado
  8. 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. 9. O Básico de Ruby M é tod os bá sic osglobo .com Rails do básico ao avançado
  10. 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_nowglobo .com Rails do básico ao avançado
  11. 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. 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.singglobo .com Rails do básico ao avançado
  13. 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? :codeglobo .com Rails do básico ao avançado
  14. 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. 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. 16. Rails - Básico cr ia n do ap p , s ca ffold i ng, rot a s, migrat ionglobo .com Rails do básico ao avançado
  17. 17. c ri and o ap li c açã o $ rails new myinvestimentsglobo .com Rails do básico ao avançado
  18. 18. c ri and o ap li c açã ogroup :development, :test do gem rspec-rails  gem capybara, ~> 1.0.0  gem factory_girl, ~> 1.3.3  gem factory_girl_railsend $ rails generate rspec:installglobo .com Rails do básico ao avançado
  19. 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 postglobo .com Rails do básico ao avançado
  20. 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çãoglobo .com Rails do básico ao avançado
  21. 21. C ri a nd o C RUD c om sca ffold $ rails g scaffold portifolio_item stock_symbol:string current_price:floatglobo .com Rails do básico ao avançado
  22. 22. R o d a nd o os te ste s $ RAILS_ENV=test bundle exec rake specglobo .com Rails do básico ao avançado
  23. 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_ofglobo .com Rails do básico ao avançado
  24. 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. 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:datetimeglobo .com Rails do básico ao avançado
  26. 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_toglobo .com Rails do básico ao avançado
  27. 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 elineglobo .com Rails do básico ao avançado
  28. 28. Mass assignmentglobo .com Rails do básico ao avançado
  29. 29. Mass assignmentglobo .com Rails do básico ao avançado
  30. 30. Mass assignmentglobo .com Rails do básico ao avançado
  31. 31. Mass assignmentglobo .com Rails do básico ao avançado
  32. 32. Possível usar Mass assignment roles :as => :adminglobo .com Rails do básico ao avançado
  33. 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. 34. Testes de integração $ rails g rspec:integration portifolio_itemsglobo .com Rails do básico ao avançado
  35. 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. 36. Exemplocontext "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]") endendglobo .com Rails do básico ao avançado
  37. 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. 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. 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. 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. 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. 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:precompileglobo .com Rails do básico ao avançado
  43. 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" endglobo .com Rails do básico ao avançado
  44. 44. What’s next??globo .com Rails do básico ao avançado

×