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.

Introdução ao Desenvolvimento WEB com Ruby on Rails

1,272 views

Published on

Slides que utilizei para ministrar uma palestra sobre Desenvolvimento WEB com Ruby on Rails no IV Congresso de Iniciação Científica da Faculdade Redentor de Itaperuna / RJ.
Versão PDF aqui: https://www.dropbox.com/s/2fkwksu00chm7nu/presentation.pdf

Published in: Technology

Introdução ao Desenvolvimento WEB com Ruby on Rails

  1. 1. Desenvolvimento Web com Ruby on Rails Por Júlio Bêtta
  2. 2. Por que Ruby ??? <ul><li>Linguagem dinâmica
  3. 3. Totalmente Orientado a Objetos
  4. 4. Sintaxe flexível
  5. 5. Cross-plataform
  6. 6. Ruby(C), jRuby(Java), IronRuby(.NET)
  7. 7. Software Livre
  8. 8. Programadores mais felizes =) </li></ul>
  9. 9. Ruby on Rails
  10. 10. <ul><li>Framework web implementado na linguagem Ruby
  11. 11. Desenvolvimento ágil de aplicações web
  12. 12. MVC
  13. 13. Utiliza o conceito Convention over Configuration (CoC)
  14. 14. E muito mais ... </li></ul>Sobre o Ruby on Rails
  15. 15. <ul><li>Principais Banco de Dados Suportados </li></ul><ul><ul><li>SQlite 3 (padrão)
  16. 16. MySQL
  17. 17. PostgreSQL
  18. 18. Oracle
  19. 19. Microsoft SQL Server </li></ul></ul>Ruby on Rails
  20. 20. <ul><li>Instalação </li></ul><ul><ul><li>Windows:
  21. 21. http://railsinstaller.org
  22. 22. Linux (Ubuntu): https://github.com/juliobetta/RoR/tree/master/installation </li></ul></ul>Ruby on Rails <ul>Os exemplos a seguir foram testados apenas em ambiente LINUX. </ul>
  23. 23. Sintaxe
  24. 24. <ul><li>IRB </li></ul><ul>Programa iniciado na linha de comando que permite a execução de comandos em Ruby com responta em tempo-real. </ul>Todos os comandos a seguir podem ser testados utilizando o irb . Sintaxe
  25. 25. <ul><li>Strings </li></ul>Sintaxe &quot;eu sou uma string&quot; 'Ruby ' + 'on Rails'
  26. 26. <ul><li>Variáveis </li></ul><ul>Não é preciso declarar o tipo: </ul>Porém a tipagem no Ruby é forte: <ul>Podemos avaliar expressões dentro de strings com conversão automática: </ul>Sintaxe nome = &quot;Ruby&quot; versao = 3 nome = &quot;Rails &quot; + versao (TYPE ERROR) versao = 3 nome = &quot;Ruby&quot; curso = &quot; #{nome} on Rails #{versao} &quot; versao = 3 nome = &quot;Rails &quot; + versao.to_s
  27. 27. <ul><li>Operações básicas </li></ul><ul><li>Operadores </li></ul>Sintaxe 5 == ( 2 + 3 ) # igualdade 2 != 3 # inigualdade 10 > 13 # maior 3 < 10 # menor 5 <= 5 # menor ou igual 5 >= 5 # maior ou igual 1 + 2 # adição 4 – 2 # subtração 2 * 2 # multiplicação 6 / 2 # divisão 15 % 2 # modulo
  28. 28. <ul><li>Controles de fluxo
  29. 29. Maneira usual: </li></ul>Sintaxe idade = 15 if (idade < 16 ) then puts 'que pariu! Você não deveria estar dirigindo.' end
  30. 30. <ul><li>Controles de fluxo
  31. 31. Maneira usual um pouco melhor: </li></ul>Sintaxe idade = 15 if idade < 16 puts 'Você não deveria estar dirigindo.' end
  32. 32. <ul><li>Controles de fluxo
  33. 33. Isso é ótimo: </li></ul>Sintaxe idade = 15 puts 'Você não deveria estar dirigindo.' if idade < 16
  34. 34. <ul><li>Controles de fluxo
  35. 35. Algo diferente: </li></ul><ul>ou: </ul>Sintaxe idade = 15 unless idade >= 16 puts 'Você não deveria estar dirigindo.' end idade = 15 puts 'Você não deveria estar dirigindo.' unless idade >= 16
  36. 36. <ul><li>Controles de fluxo
  37. 37. Não me esqueci do else: </li></ul><ul>Famosos operadores ternários: </ul>Sintaxe idade = 18 if idade < 16 puts 'Você não deveria estar dirigindo.' else puts 'Pode seguir!' end idade = 18 puts idade >= 16 ? 'Pode seguir!' : 'Vai pra casa!'
  38. 38. <ul><li>Controles de fluxo
  39. 39. Loops </li></ul>Sintaxe letras = [ 'a' , 'b' , 'c' , 'd' ] letras.each do |letra| puts letra end for i in 1..10 puts i end 5.times do |n| puts n end 5.upto(10) do puts 'Oi!' end i = 0 while i < 5 puts i i += 1 end
  40. 40. <ul><li>Arrays e Hashes </li></ul>Sintaxe objetos = [ 'carro' , 'bicicleta' , 'pizza' ] objetos = %w( teclado mouse livro ) puts objetos[ 0 ] <ul>Arrays </ul>atributos = { :nome => 'Yukihiro' , :sobrenome => 'Matsumoto' , :email => 'matz@ruby.co.jp ' } puts atributos[ :nome ] <ul>Hash </ul>
  41. 41. <ul><li>Ruby :symbols
  42. 42. São cadeias de caracteres usualmente utilizados como identificadores. Eles são como strings , porém reusam o mesmo espaço de memória.
  43. 43. Vejamos: </li></ul>Sintaxe &quot; carro&quot; .object_id => 2953810 &quot; carro &quot; .object_id => 2951340 : carro .object_id => 166418 : carro .object_id => 166418
  44. 44. <ul><li>Métodos (funções) </li></ul>Sintaxe def diga_adeus_para(nome, sobrenome) &quot;Adeus #{nome} #{sobrenome} ...&quot; end puts diga_adeus_para( &quot;Yukihiro&quot; , &quot;Matsumoto&quot; ) puts diga_adeus_para &quot;Yukihiro&quot; , &quot;Matsumoto&quot; <ul>Como parênteses neste caso são opcionais, soa mais natural como: </ul>
  45. 45. <ul><li>Classes </li></ul><ul>A maneira mais longa: </ul><ul>… e a mais curta: </ul>Sintaxe class Pessoa @nome @sobrenome def nome @nome end def sobrenome @sobrenome end def nome=(nome) @nome = nome end def sobrenome=(sobrenome) @sobrenome = sobrenome end end class Pessoa attr_accessor :nome, :sobrenome end Define getters e setters class Pessoa attr_reader :nome, :sobrenome end Define somente getters class Pessoa attr_writer :nome, :sobrenome end Define somente setters
  46. 46. <ul><li>Classes </li></ul><ul>Criar novas instância com o método .new </ul><ul>Criar novas instância com o método .new </ul>Sintaxe matz = Pessoa .new matz.nome = &quot;Yukihiro&quot; matz.sobrenome = &quot;Matsumoto&quot; puts matz.nome puts matz.sobrenome
  47. 47. <ul><li>Classes </li></ul><ul>Herança </ul>Sintaxe class Usuario < Pessoa attr_accessor :nome_usuario, :senha end matz = Usuario .new matz.nome = &quot;Yukihiro&quot; matz.sobrenome = &quot;Matsumoto&quot; matz.nome_usuario = &quot;matz&quot; matz.senha = &quot;abc123&quot;
  48. 48. <ul><li>Classes </li></ul><ul>As classes são abertas: </ul>Sintaxe class Pessoa def initialize(nome, sobrenome) @nome = nome @sobrenome = sobrenome end def to_s &quot; #{@nome} #{@sobrenome} &quot; end end matz = Pessoa .new &quot; Yukihiro&quot; , &quot; Matsumoto &quot; puts matz
  49. 49. Mão na massa !!!
  50. 50. <ul><li>Switter </li></ul><ul><ul><li>Aplicação similar a uma seção do famoso microblog
  51. 51. Exibir usuários e microposts (sweets) </li></ul></ul>Mão na massa <ul><ul><li>Entidades </li></ul></ul>
  52. 52. <ul><li>Switter </li></ul>Estrutura de diretórios gerada automaticamente Mão na massa $ rails new switter
  53. 53. <ul><li>Switter </li></ul>Mão na massa Organiza a aplicação em componentes
  54. 54. <ul><li>Switter </li></ul>Configuração da aplicação Arquivos estáticos Mão na massa
  55. 55. <ul><li>Página Inicial </li></ul><ul>Criando um Controller: </ul><ul><ul><li>No terminal: </li></ul></ul>Mão na massa $ rails generate controller paginas inicio
  56. 56. <ul><li>Página Inicial </li></ul>Arquivos gerados automaticamente na pasta app Mão na massa $ rails generate controller paginas inicio
  57. 57. <ul><li>Página Inicial </li></ul><ul>Criando uma Action no Controller que acabamos de gerar: </ul>Mão na massa class PaginasController < ApplicationController def inicio render 'paginas/inicio' end end <ul>app/controllers/paginas_controller.rb </ul><h2> Seja bem-vindo ao Switter!!! </h2> <ul>app/views/paginas/inicio.html.erb </ul>
  58. 58. <ul><li>Layout padrão </li></ul><ul><ul><li>Contém a estrutura HTML da aplicação;
  59. 59. A ideia é que as views geradas nos controllers sejam incluídas neste arquivo, através do método yield . </li></ul></ul><ul>app/views/layouts/application.html.erb </ul>Mão na massa < !DOCTYPE html > <html> <head> <title> Switter </title> <%= stylesheet_link_tag &quot;application&quot; %> <%= javascript_include_tag &quot;application&quot; %> <%= csrf_meta_tags %> </head> <body> <%= yield %> </body> </html>
  60. 60. <ul><li>Rotas </li></ul><ul>Sistema que examina a URL solicitada e determina qual ação deve deve ser executada pela aplicação. </ul><ul>config/routes.rb </ul>Mão na massa Switter ::Application.routes.draw do get 'paginas/inicio' end
  61. 61. <ul><li>Inicialização </li></ul><ul>Rails já possui um webserver embutido: </ul>Mão na massa $ rails server
  62. 62. <ul><li>Scaffolding </li></ul><ul><ul><li>Criar model, controller e views para criar, exibir, atualizar e deletar (CRUD) o recurso que especificarmos
  63. 63. Também é responsável por criar as tabelas do banco de dados </li></ul></ul>Mão na massa $ rails generate scaffold usuario nome:string email:string $ rails generate scaffold micropost usuario_id:integer conteudo:string
  64. 64. <ul><li>Scaffolding </li></ul>Estrutura gerada na pasta app Mão na massa
  65. 65. <ul><li>Scaffolding </li></ul><ul>Rotas geradas </ul>Mão na massa Switter ::Application.routes.draw do get 'paginas/inicio' resources :usuarios resources :microposts end <ul>config/routes.rb </ul>
  66. 66. <ul><li>Migrations </li></ul>Mão na massa $ rake db:migrate
  67. 67. <ul><li>Rake </li></ul><ul><ul><li>Executar tarefas
  68. 68. Funciona como o Make, Ant, etc...
  69. 69. Utilizado para gerenciar banco de dados, rodar testes, e o que mais for preciso
  70. 70. Executar tarefas personalizadas </li></ul></ul>Mão na massa $ rake --tasks
  71. 71. <ul><li>Scaffolding </li></ul>Mão na massa
  72. 72. <ul><li>Scaffolding </li></ul>Mão na massa
  73. 73. <ul><li>Scaffolding é bom porque... </li></ul><ul><ul><li>É rapido
  74. 74. Mostra como o Rails funciona
  75. 75. Usa padrões que usaremos no dia-a-dia </li></ul></ul>Mão na massa
  76. 76. <ul><li>Scaffolding é ruim porque... </li></ul><ul><ul><li>O código não é otimizado
  77. 77. Pode adicionar mais código do que venhamos precisar
  78. 78. É muito simplório (uma tabela, sem possibilidades de gerar relacionamentos automaticamente) </li></ul></ul>Mão na massa <ul>Profissionais da área não utilizam esta técnica em ambiente de produção. </ul>
  79. 79. <ul><li>ActiveRecord </li></ul><ul><ul><li>Biblioteca ORM que encapsula as tabelas do banco de dados como objetos
  80. 80. Utiliza o poder do Ruby de gerar código (metaprogramação) </li></ul></ul>Mão na massa
  81. 81. <ul><li>ActiveRecord Interativo </li></ul><ul>Os exemplos a seguir podem ser testados por meio do rails console , que p ode ser executado de duas maneiras: </ul><ul>* utilizar o comando exit para sair do console. </ul>Mão na massa $ rails console $ rails console --sandbox <ul>Com o parâmetro sandbox ativado, toda mudança no banco de dados será desfeita após a saída do console. </ul>
  82. 82. <ul><li>ActiveRecord Interativo </li></ul>Mão na massa matz= Usuario . new({ :nome => 'Yukihiro' , :email => 'matz@ruby.co.jp' }) matz.save <ul>Criar um usuário: </ul>matz = Usuario .where({ :nome => 'Yukihiro' }) <ul>Selecionar usuário: </ul>matz.nome = 'Yukihiro Matsumoto' matz.save <ul>Alterar usuário: </ul>Usuario .find(1).destroy <ul>Deletar usuário: </ul>
  83. 83. <ul><li>Relacionamento </li></ul><ul>Como vimos no início, um usuário possui vários microposts e um micropost pertence a apenas um usuário. </ul>Mão na massa <ul><ul><li>Entidades </li></ul></ul>
  84. 84. <ul><li>Relacionamento </li></ul>Com isso, é gerado, via metaprogramação, o método usuario na instância da classe Micropost e o método microposts na instância da classe Usuario. Mão na massa class Usuario < ActiveRecord::Base has_many :microposts end <ul>app/models/usuario.rb </ul>class Micropost < ActiveRecord::Base belongs_to :usuario end <ul>app/models/micropost.rb </ul>
  85. 85. <ul><li>Relacionamento (console) </li></ul>Mão na massa # seleciona o último usuario inserido no BD usuario = Usuario .last # e atribui a variavel todos seus microposts microposts = usuario. microposts <ul>Listar todos os microposts de um determinado usuário: </ul>matz = Usuario .where :nome => 'Yukihiro Matsumoto' micropost = Micropost .new micropost.conteudo = 'Eu sou o criador do Ruby!' micropost. usuario = matz micropost.save # imprime Yukihiro Matsumoto puts micropost.usuario.nome <ul>Cria um micropost e o atribui a um usuário: </ul>
  86. 86. <ul><li>Relacionamento (views) </li></ul>Mão na massa ... <tr> <td> <%= micropost.usuario_id %> </td> <td> <%= micropost.conteudo %> </td> ... <ul>app/views/microposts/index.html.erb gerado pelo scaffold. </ul>... <tr> <td> <%= micropost. usuario.nome %> </td> <td> <%= micropost.conteudo %> </td> ... <ul>app/views/microposts/index.html.erb modificado. </ul>
  87. 87. <ul><li>Relacionamento (views) </li></ul>Mão na massa
  88. 88. <ul><li>Relacionamento (views) </li></ul>Mão na massa ... <div class= &quot;field&quot; > <%= f.label :usuario_id %> <br /> <%= f.text_field :usuario_id %> ... <ul>app/views/microposts/_form.html.erb gerado pelo scaffold. </ul>... <div class= &quot;field&quot; > <%= f.label :usuario_id %> <br /> <%= f.collection_select :usuario_id, Usuario .all, :id, :nome %> ... <ul>app/views/microposts/_form.html.erb modificado. </ul>
  89. 89. <ul><li>Relacionamento (views) </li></ul>Mão na massa
  90. 90. <ul><li>Valida ções </li></ul>Mão na massa class Usuario < ActiveRecord::Base has_many :microposts, :dependent => :destroy validates_presence_of :nome, :email validates_uniqueness_of :email end <ul>app/models/usuario.rb </ul>
  91. 91. <ul><li>Valida ções </li></ul>Mão na massa
  92. 92. <ul><li>Valida ções </li></ul><ul>OU </ul>Mão na massa class Micropost < ActiveRecord::Base belongs_to :usuario validates :conteudo, :presence => true, :length => { :maximum => 140} end class Micropost < ActiveRecord::Base belongs_to :usuario validates_presence_of :conteudo validates_length_of :conteudo, :maximum => 140 end <ul>app/models/micropost.rb </ul>
  93. 93. <ul><li>Valida ções </li></ul>Mão na massa
  94. 94. <ul><li>Gems </li></ul><ul><ul><li>Gerenciador de pacotes do Ruby
  95. 95. Facilita distribuicão de códigos
  96. 96. Age como o apt-get (derivados do Debian)
  97. 97. No Rails as gems podem ser adicionadas no arquivo Gemfile </li></ul></ul>Mão na massa
  98. 98. O que vimos até agora <ul><li>Brevemente aspectos principais da sintaxe Ruby
  99. 99. Principais características do Rails
  100. 100. Como criar uma aplicacão
  101. 101. Criar controller e actions
  102. 102. Layouts
  103. 103. Scaffolding
  104. 104. Active Record
  105. 105. Validacões
  106. 106. Gems </li></ul>
  107. 107. Próximos passos <ul><li>Aprender mais! </li><ul><li>www.ruby-br.org
  108. 108. www.rubyonrails.com.br
  109. 109. www.akitaonrails.com
  110. 110. www.ruby.railstutorial.org/ruby-on-rails-tutorial-book
  111. 111. (em inglês) </li></ul></ul>
  112. 112. PERGUNTAS ??? <ul><li>Podem me escrever diretamente </li><ul><li>[email_address] </li></ul></ul>

×