Desenvolvimento web com Ruby on Rails (parte 1)

2.584 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
8 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
2.584
No SlideShare
0
A partir de incorporações
0
Número de incorporações
11
Ações
Compartilhamentos
0
Downloads
129
Comentários
0
Gostaram
8
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Desenvolvimento web com Ruby on Rails (parte 1)

  1. 1. Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps
  2. 2. 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
  3. 3. Origem @jlucasps Open source desde 2004 David Heinemeier Hansson
  4. 4. 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
  5. 5. Origem Escrito em Ruby Yukihiro Matsumoto @jlucasps
  6. 6. Testes Testes Testes Origem Framework para desenvolvimento de apps Web seguindo o padrão MVC (Model-View- Controller) @jlucasps Model View Controller HTTP/SSL Routes Helpers Middleware Responders Renders Session Logs Associations Validations Queries Callbacks Connections Migrations Assets Helpers Builders Templates Partials
  7. 7. Por que aprender Ruby on Rails? O que vocês me dizem? @jlucasps
  8. 8. Por que aprender Ruby on Rails? @jlucasps ● Tecnologia ○ Implementado na Linguagem Ruby ○ Linguagem Interpretada ○ Orientada a Objetos ○ Sintaxe bastante inspirada em Perl e Lisp
  9. 9. Ruby foi desenvolvida por Yukihiro ‘Matz’ Matsumoto, e lançada em 1995 É uma linguagem Orientada a Objetos de tipagem forte e dinânima Características principais: Por que aprender Ruby on Rails? @jlucasps Simplicidade do código escrito Poder do código gerado
  10. 10. 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.
  11. 11. Por que aprender Ruby on Rails? Ruby foi pensada para ser uma linguagem divertida de usar (joy to use) @jlucasps
  12. 12. 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
  13. 13. 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
  14. 14. Por que aprender Ruby on Rails? ● Estrutura do framework ○ Camada de persistência independente @jlucasps
  15. 15. Por que aprender Ruby on Rails? ● Conventions over Configurations (CoC) @jlucasps
  16. 16. 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
  17. 17. 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
  18. 18. 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.
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. Por que aprender Ruby on Rails? Dependências em uma aplicação simples @jlucasps
  23. 23. Por que aprender Ruby on Rails? Testes automatizados @jlucasps
  24. 24. Por que aprender Ruby on Rails? ● Configurações de DEV, TST, STG, PRD ● Deploy @jlucasps
  25. 25. 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
  26. 26. Por que aprender Ruby on Rails? Muitas gems, mas muitas mesmo rubygems.org e ruby-toolbox.com @jlucasps jquery-rails pg mailcatcher devise aws-sdk friendly_id rmagick delayed_job jquery-fileupload-rails tiny-mce will_paginate meta-search i18n-js i18n guard-test lol-dba capybara rspec factory-girl simple-cov better_errors
  27. 27. A linguagem Ruby Abra 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
  28. 28. 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
  29. 29. A linguagem Ruby @jlucasps irb(main):007:0> "João Lucas" => "João Lucas" Vamos avaliar alguns valores em forma de texto Digite 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"
  30. 30. 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"
  31. 31. 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"]
  32. 32. 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>'
  33. 33. 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"
  34. 34. 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"
  35. 35. 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 interessantes irb(main):048:0> [2, 4, 6, 8, 10].min => 2 irb(main):049:0> [2, 4, 6, 8, 10].max => 10
  36. 36. 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
  37. 37. A linguagem Ruby @jlucasps Armazenando os objetos em variáveis, podemos trabalhar mais facilmente irb(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]
  38. 38. 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]
  39. 39. 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
  40. 40. 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"
  41. 41. 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") => true irb(main):077:0> text.include?("my home") => false irb(main):084:0> text.include? "black" => true
  42. 42. 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 Arrays irb(main):114:0> songs[:good] = "Stairway to Heaven" => "Stairway to Heaven" irb(main):115:0> songs[:horrible] = "Boquinha da garrafa" => "Boquinha da garrafa"
  43. 43. A linguagem Ruby @jlucasps Agora vamos conhecer outras estruturas não muito conhecidas irb(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, "
  44. 44. 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
  45. 45. 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.
  46. 46. @jlucasps A linguagem Ruby module One class Fred end $f1 = :Fred end module Two Fred = 1 $f2 = :Fred end def Fred() end $f3 = :Fred irb(main):186:0> $f1.object_id => 463148 irb(main):187:0> $f2.object_id => 463148 irb(main):188:0> $f3.object_id => 463148
  47. 47. 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.
  48. 48. 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 end end
  49. 49. 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
  50. 50. 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.
  51. 51. 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
  52. 52. 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.
  53. 53. 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.
  54. 54. 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.">
  55. 55. 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 => 6 irb(main):009:0> doc.title => "Ruby Tutorial" irb(main):010:0> doc.author => "Joao Lucas"
  56. 56. 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.
  57. 57. 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 end end
  58. 58. 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>
  59. 59. Ruby on Rails full stack @jlucasps Model View Controller Web Server App Server Rails request response
  60. 60. Ruby on Rails full stack @jlucasps O que é um request? é um conjunto de instruções que diz ao servidor qual tipo de resposta é esperada
  61. 61. 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:
  62. 62. Ruby on Rails full stack @jlucasps header data:
  63. 63. Ruby on Rails full stack @jlucasps Browser para o Web Server Model View Controller Web Server App Server Rails
  64. 64. Ruby on Rails full stack @jlucasps http://myapp.com/users/2/lists
  65. 65. Ruby on Rails full stack @jlucasps Model View Controller Web Server App Server Rails REQUEST: GET http://myapp.com/users/2/lists
  66. 66. 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
  67. 67. Ruby on Rails full stack @jlucasps Model View Controller Web Server App Server Rails REQUEST: GET http://myapp.com/users/2/lists Web Server para o App Server ACCEPTED: passado para o App Server
  68. 68. 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
  69. 69. Ruby on Rails full stack @jlucasps Rails Model View Controller Web Server App Server Rails REQUEST: GET http://myapp.com/users/2/lists ACCEPTED: passado para o App Server Request passado para o Rails
  70. 70. Ruby on Rails full stack @jlucasps Model View Controller Rails Router Rails
  71. 71. Ruby on Rails full stack @jlucasps Router
  72. 72. Ruby on Rails full stack @jlucasps Router
  73. 73. Ruby on Rails full stack @jlucasps Router
  74. 74. 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"
  75. 75. Ruby on Rails full stack @jlucasps Router
  76. 76. Ruby on Rails full stack @jlucasps Model View Controller Rails Router Controller Controller Model View Action Action Action Action Action Action GET /users/2/lists CONTROLLER: "lists" ACTION: "index"
  77. 77. Ruby on Rails full stack @jlucasps Model View Controller Rails Router Controller ListsController Model View index new create update destroy ........ GET /users/2/lists CONTROLLER: "lists" ACTION: "index"
  78. 78. Ruby on Rails full stack @jlucasps Controller Action
  79. 79. Ruby on Rails full stack @jlucasps Model Convetions over Configurations
  80. 80. Ruby on Rails full stack @jlucasps Model @user = User.find(params[:user_id]) @lists = List.find_all_by_user_id(params[:user_id]) ListsController index new create update destroy ........ User Model List Model Active Record Active Record Banco de dados tabela 'users' tabela 'lists'
  81. 81. 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 Rails Router action action action
  82. 82. 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 Headers Accept: text/html, application/xhtml+xml
  83. 83. Ruby on Rails full stack @jlucasps HTTP Response
  84. 84. 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.
  85. 85. Ruby on Rails full stack @jlucasps HTTP Response
  86. 86. 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 Rails Router action action action VIEW cria a resposta para o RESPONSE BODY
  87. 87. Ruby on Rails full stack @jlucasps Model View Controller Web Server App Server Rails 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 :-)
  88. 88. Ruby on Rails full stack @jlucasps Response
  89. 89. @jlucasps Aplicação Básica ● Ferramentas para desenvolvimento ○ IDE's (Integrated Development Environment)
  90. 90. @jlucasps Aplicação Básica ● Ferramentas para desenvolvimento ○ IDE's (Integrated Development Environment)
  91. 91. @jlucasps Aplicação Básica ● Ferramentas para desenvolvimento ○ IDE's (Integrated Development Environment)
  92. 92. @jlucasps Aplicação Básica ● Ferramentas para desenvolvimento ○ IDE's (Integrated Development Environment)
  93. 93. Aplicação Básica @jlucasps ● Editores de texto ○ Sublime Text 2
  94. 94. Aplicação Básica @jlucasps ● Editores de texto
  95. 95. Aplicação Básica @jlucasps ● Terminal / console ○ iTerm, Konsole, Gnome-Terminal
  96. 96. Aplicação Básica @jlucasps ● Terminal / console
  97. 97. Aplicação Básica @jlucasps ● Browsers Antigos
  98. 98. Aplicação Básica @jlucasps ● Gerenciamento de código
  99. 99. Aplicação Básica @jlucasps ● Gerenciamento de versões e código CVS (Concurrent Version System)
  100. 100. Aplicação Básica @jlucasps Rubygems Rails ● Core Ruby
  101. 101. 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$
  102. 102. 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
  103. 103. 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ção db/ Configurações dos bancos de dados doc/ Documentação da aplicação lib/ Bibliotecas utilizadas pela aplicação lib/assets Assets utilizados pelas bibliotecas da aplicação log/ Logs da aplicação public/ Conteúdos de acesso público (páginas de errors) script/rails Script para executar generators, iniciar servidor local, iniciar rails console test/ Suite de testes da aplicação (substituído pelo spec/ quando utilizado RSpec) tmp/ Arquivos temporários vendor/ Códigos de terceiros que devem estar junto com a aplicação vendor/assets Assets fornecidos por terceiros (plugins jQuery, Javascript, CSS's, imagens) README.rdoc Breve descrição da aplicação Rakefile Configuração para execução de rake tasks da aplicação Gemfile Gems necessárias para a aplicação Gemfile.lock Lista detalhada de todas as dependências da aplicação config.ru Configuração para servidores que utilizam Rack .gitignore Arquivos e diretórios a serem ignorados pelo Git
  104. 104. Versionamento com Git @jlucasps Sistema de controle de versão distribuído Projetado por Linus Torvalds PUSH PU LL PU SHPUSH
  105. 105. Versionamento com Git @jlucasps diretório $ git add . $ git commit modificação $ git add . $ git commit modificação modificação $ git init .git/
  106. 106. Versionamento com Git Setup inicial do Git: $ git config --global user.name "Your Name" $ git config --global user.email your.email@example.com 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
  107. 107. Versionamento com Git Criar conta no github Adicionar chave SSH $ ssh-keygen -t rsa -C "your_email@example.com" 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 git@github.com:<username>/first_app.git $ git push -u origin master Editar README e commit @jlucasps
  108. 108. Configuração de Assets Download do Twitter Bootstrap Mover imagens bootstrap/img/* -> app/assets/images/ Mover arquivos JavaScript bootstrap/js/bootstrap.js -> app/assets/javascripts/ Mover arquivos de stylesheets bootstrap/css/bootstrap.css -> app/assets/stylesheets/ bootstrap/css/bootstrap-responsive.css -> app/assets/stylesheets/ @jlucasps
  109. 109. Configuração de Assets Remover app/public/index.html Criar app/controllers/welcome_controller.rb Criar action index Adicionar rota :root Criar view app/view/welcome/index.html.erb bootstrap.css -> bootstrap.css.erb Utilizar asset_path nas URLs para assets @jlucasps
  110. 110. 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
  111. 111. Deploy na Heroku @jlucasps first_app$ git push hereoku master Deploy da aplicação: Commitar modificações
  112. 112. Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps Obrigado!

×