SlideShare une entreprise Scribd logo
1  sur  70
RUBY ON RAILS
Criando uma aplicação do inicio ao fim
APRESENTAÇÃO
Felipe Gadelha Ruoso
Pós-graduando em Desenvolvimento Web e Aplicativos Móveis
5 anos de experiência com Ruby
Desenvolvedor Ruby na Tray
RubyConf 2017
https://felipegruoso.herokuapp.com/
COUNTEÚDO
• Introdução
• O que vamos construir?
• Quais recursos vamos utilizar?
• Testes
• Deploy
INTRODUÇÃO - RUBY
Ruby é uma linguagem dinâmica, open source com foco na
simplicidade e na produtividade. Tem uma sintaxe elegante de leitura
natural e fácil escrita.
Criado por: Yukihiro Matsumoto - Matz (1995)
Versão atual: 2.3.5
https://www.ruby-lang.org/pt/
INTRODUÇÃO - RAILS
Rails é um framework para aplicações web baseado no modelo MVC.
Contém tudo que é necessário para construir aplicações fantásticas
de maneira simples e divertida.
Criado por: David Heinemeier Hansson - DHH (2003)
Versão atual: 5.1.4
http://rubyonrails.org/
INTRODUÇÃO - GEM
Gem é a abstração de um trecho de código ou conjunto de arquivos
reutilizáveis etiquetadas com um nome e versão.
Criado por: Nick Quaranto (2009)
http://www.akitaonrails.com/2009/2/2/entendendo-rubygems
https://rubygems.org/
O QUE VAMOS CONSTRUIR?
Vamos fazer algo simples e rápido!
Nossa aplicação vai ser um gerenciador de tarefas, também
conhecido como TODO List. Precisamos basicamente de:
• Login de usuário;
• Gerenciamento de Tarefas;
QUAIS RECURSOS VAMOS UTILIZAR?
Essa aplicação parece simples, porém, existe uma certa complexidade
Controle de usuário – Devise (Gem - Engine)
Controle de Idioma – Internacionalização (I18n)
Testes - Rspec
Deploy – Heroku
Interface – Bootstrap (Gem)
TESTES
Manter a qualidade da sua aplicação é extremamente importante. Além de
auxiliar na manutenção, ajuda na detecção de falhas (bugs) antes de sua
publicação no mercado.
TDD - Rspec (Gem)
BDD – Cucumber (Gem)
http://rspec.info/
https://cucumber.io/
DEPLOY
Deploy é o processo de publicação de uma aplicação. É nesse momento
que seu código “vai para produção”.
Heroku é uma plataforma cloud desenvolvida em Ruby preparada para
hospedar aplicações de várias linguagens. Possui um ambiente
customizável, de fácil utilização e oferece planos gratuitos.
https://www.heroku.com/
HANDS ON RAILS
Vamos trabalhar...
PASSO 1
Criando a aplicação
CRIANDO A APLICAÇÃO
Executar no console
rails new todo_list -d mysql
Criar banco de dados
bundle exec rake db:create
Rodar a aplicação
rails s -p 3000 -b 0.0.0.0
Antes de continuar...
ALTERAR A GEM DE TESTES
Adicionar em group :development, :test no Gemfile
gem ‘rspec-rails’
Executar no console
bundle install
Remover a pasta test
rm –rf test
PASSO 2
Adicionando usuários
ADICIONANDO USUÁRIOS
Adicionar no Gemfile
gem 'devise’
Executar no console
bundle install
rails generate devise:install
Seguir os passos 1 e 2 apresentados no console
ADICIONANDO USUÁRIOS
Criar model User
rails generate devise user
Executar alterações no banco de dados
bundle exec rake db:migrate
PASSO 3
Primeiro controller e primeira view
PRIMEIRO CONTROLLER
Criar controller home com action index
rails g controller home index
Executar a aplicação e acessar a rota ROOT
localhost:3000
PRIMEIRA VIEW
Abrir o arquivo app/views/home/index.html.erb
Substituir o conteúdo
<h1>Bem-vindo ao Gerenciador de Tarefas</h1>
Executar a aplicação e acessar a rota ROOT
localhost:3000
PASSO 4
Links
LINKS
Adicionar em app/views/home/index.html.erb
<%= link_to “Signin”, new_user_session_path %>
<%= link_to “Signup”, new_user_registration_path %>
Adicionar em app/views/devise/_links.html.erb
<%= link_to “Home”, root_path %>
LINKS
Adicionar em app/helpers/application_helper.rb
def signout_link
return if current_user.blank?
content_tag :li do
link_to(“Logout”, destroy_user_session_path, method: :delete)
end
end
Adicionar dentro da tag body em app/views/layouts/application.html.erb
<%= signout_link %>
PASSO 5
Conhecendo o I18n
CONHECENDO O I18N
Adicionar no Gemfile
gem 'rails-i18n’
Executar no console
bundle install
CONHECENDO O I18N
Alterar arquivo config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*'
,'*.{rb,yml}').to_s]
config.i18n.default_locale = :'pt-BR’
Substituir conteúdo do arquivo app/views/home/index.html.erb
<h1><%= I18n.t('home.welcome') %></h1>
CONHECENDO O I18N
Adicionar arquivos config/locales/home/pt-BR.yml com o conteúdo
pt-BR:
home:
welcome: 'Bem-vindo ao Gerenciador de Tarefas’
Executar a aplicação e acessar a rota ROOT
localhost:3000
PASSO 6
Criando Tarefas
CRIANDO TAREFAS
Criar model task
rails g scaffold task name:string description:string done:boolean
user:references
Atualizar banco de dados
bundle exec rake db:migrate
Adicionar relacionamento em app/model/user.rb
has_many :tasks
PASSO 7
Testes Unitários
TESTES UNITÁRIOS
Instalar o Rspec na aplicação
rails generate rspec:install
Executando testes
bundle exec rspec
TESTES UNITÁRIOS
Criar arquivo spec/task_spec.rb com o conteúdo
require 'rails_helper'
describe Task, type: :model do
before do
User.create(email: 'user@gmail.com', password: '123456789')
end
context 'when all parameters are given' do
let(:params) { { user: User.last, name: 'My Task', description:
'Teach Tests' } }
it 'persists the task' do
task = Task.create(params)
expect(task).to be_persisted
end
end
context 'when some parameter is missing' do
let(:params) { { user: User.last } }
it 'does not persist the task' do
task = Task.create(params)
expect(task).not_to be_persisted
end
end
end
PASSO 8
Validações
VALIDAÇÕES
Adicionar em app/models/task.rb
validates :name, :description, presence: true
Alterar action index em app/controllers/tasks_controller.rb
@tasks = current_user.tasks
Alterar action new em app/controllers/tasks_controller.rb
@task = current_user.tasks.new
VALIDAÇÕES
Alterar action create em app/controllers/tasks_controller.rb
@task = current_user.tasks.new(task_params)
Alterar set_task em app/controllers/tasks_controller.rb
@task = Task.find_by!(id: params[:id], user_id: current_user.id)
Alterar task_params em app/controllers/tasks_controller.rb
params.require(:task).permit(:name, :description, :done)
PASSO 9
Permissões de acesso
PERMISSÕES DE ACESSO
Pedir autenticação de usuário em
app/controllers/application_controller.rb
before_action :authenticate_user!
Ignorar autenticação de usuário em
app/controllers/home_controller.rb
skip_before_action :authenticate_user!
PASSO 10
Deploy
DEPLOY
Criar conta no heroku
https://signup.heroku.com
Instalar Heroku-CLI
https://devcenter.heroku.com/articles/heroku-cli#download-and-install
Criar uma aplicação
https://dashboard.heroku.com/new-app
DEPLOY
Executar no console
cd path/to/app
Realizar autenticação no heroku
heroku login
Inserir suas credenciais de acesso
DEPLOY
Selecionar a forma que deseja realizar o deploy e seguir os passos
https://dashboard.heroku.com/apps/new-blog-teste/deploy/heroku-git
Para esse exemplo, vamos usar o git. Executar no console
git init
Adicionar referência do heroku como remote executando no console
heroku git:remote -a app-name
DEPLOY
Adicionar addon gratuito de banco de dados no heroku executando no console
heroku addons:create cleardb:ignite
Recuperar URL do banco de daods adicionado. Executar no console
heroku config | grep CLEARDB_DATABASE_URL
O retorno do comando anterior será algo nesse formato
CLEARDB_DATABASE_URL: mysql://user:pass@host.cleardb.net...
DEPLOY
Para que o heroku se conecte no banco, é necessário atribuir a variável de
ambiente DATABASE_URL
Executar no console
heroku config:set DATABASE_URL=‘mysql2://user:pass@host.cleardb.net...’
ATENÇÃO: Alterar mysql:// para mysql2://
Pelo console, executar migrations no banco de dados
heroku run rake db:migrate
DEPLOY
Executar o seguinte comando no console para visualizar a URL de
acesso da sua aplicação
heroku apps:open
Manually visit https://app-name.herokuapp.com in your browser.
PASSO 11
Mudando o visual
MUDANDO O VISUAL
Adicionar no Gemfile
gem 'twitter-bootstrap-rails'
gem 'devise-bootstrap-views'
gem 'jquery-rails’
Executar no console
bundle install
MUDANDO O VISUAL
Adicionar em cima do primeiro require em
app/assets/javascripts/application.js
//= require twitter/bootstrap
Adicionar arquivos do bootstrap na aplicação
rails generate bootstrap:install static
CRIANDO TAREFAS
Personalizar views de tarefas com bootstrap
rails g bootstrap:themed Tasks
Remover app/assets/stylesheets/scaffolds.scss
MUDANDO O VISUAL
Criar arquivo config/locales/pt-BR.bootstrap.yml com o conteúdo
pt-BR:
breadcrumbs:
application:
root: "Início"
pages:
pages: "Páginas"
helpers:
actions: "Ações"
links:
back: "Voltar"
cancel: "Cancelar"
confirm: "Tem certeza?"
destroy: "Excluir"
new: "Novo"
edit: "Editar"
show: "Detalhes"
titles:
edit: "Editar %{model}"
save: "Salvar %{model}"
new: "Novo %{model}"
delete: "Excluir %{model}"
MUDANDO O VISUAL
Adicionar em cima do primeiro require em
app/assets/stylesheets/application.css
*= require devise_bootstrap_views
Gerar locales para views do devise
rails g devise:views:locale pt-BR
MUDANDO O VISUAL
Personalizando layout principal
rails g bootstrap:layout application
Personalizando layouts do devise
rails g devise:views:bootstrap_templates
MUDANDO O VISUAL
Comentar as tags favicon_link_tag nas linhas 14, 18, 22, 26 e 30 do
arquivo app/views/layout/application.html.erb
<%#= favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-
touch-icon-precomposed', :type => 'image/png', :sizes => '144x144’ %>
…
<%#= favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-
touch-icon-precomposed', :type => 'image/png', :sizes => '114x114’ %>
…
<%#= favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-
icon-precomposed', :type => 'image/png', :sizes => '72x72’ %>
…
<%#= favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-
precomposed', :type => 'image/png' %>
…
<%#= favicon_link_tag 'favicon.ico', :rel => 'shortcut icon' %>
PASSO 12
Ficando mais bonito ainda
FICANDO MAIS BONITO AINDA
Substituir container do layout app/views/layouts/application.html.erb
<div class="container">
<div class="row">
<div class="col-lg-12">
<%= bootstrap_flash %>
<%= yield %>
</div>
</div><!--/row-->
</div> <!-- /container -->
FICANDO MAIS BONITO AINDA
Substituir o element ul do layout
app/views/layouts/application.html.erb
<ul class="nav navbar-nav">
<%= signout_link %>
</ul>
Substituir link do layout app/views/layouts/application.html.erb
<a class="navbar-brand" href="/">Todo List</a>
FICANDO MAIS BONITO AINDA
Substituir link em app/helpers/application_helper.rb
link_to(I18n.t('application.signout'), destroy_user_session_path, method:
:delete)
FICANDO MAIS BONITO AINDA
Adicionando links de login e cadastro em app/views/home/index.html.erb
<%= link_to I18n.t('application.signin'), new_user_session_path, class: 'btn btn-default' %>
<%= link_to I18n.t('application.signup'), new_user_registration_path, class: 'btn btn-primary’
%>
Adicionar I18n config/locales/application/pt-BR.yml
pt-BR:
application:
signout: 'Sair'
signin: 'Entrar'
signup: 'Cadastrar'
PASSO 13
Ajustando Views
AJUSTANDO VIEWS
Remover campo user_id em app/views/tasks/_form.html.erb
<div class="form-group">
<%= f.label :user_id, :class => 'control-label col-lg-2' %>
<div class="col-lg-10">
<%= f.text_field :user_id, :class => 'form-control' %>
</div>
<%=f.error_span(:user_id) %>
</div>
AJUSTANDO VIEWS
Alterar campo done em app/views/tasks/_form.html.erb
<div class="form-group">
<%= f.label :done, :class => 'control-label col-lg-2' %>
<div class="col-lg-10">
<div class="checkbox">
<label><%= f.check_box :done %></label>
</div>
</div>
<%=f.error_span(:done) %>
</div>
AJUSTANDO VIEWS
Remover campo user_id em app/views/tasks/show.html.erb
<dt><strong><%= model_class.human_attribute_name(:user_id)
%>:</strong></dt>
<dd><%= @task.user_id %></dd>
Remover campo user_id em app/views/tasks/index.html.erb
<th><%= model_class.human_attribute_name(:user_id) %></th>
...
<td><%= task.user_id %></td>
PASSO 14
Falta pouco
FALTA POUCO
Alterar botão em app/views/tasks/_form.html.erb
<%= f.submit t('.' + action_name), :class => 'btn btn-primary’ %>
Alterar mensagem de erro em app/views/tasks/_form.html.erb
<h3 class="panel-title"><%= t('application.prohibited_from_being_saved', count:
@task.errors.count) %>:</h3>
Mover error_span para dentro da div col em app/views/tasks/_form.html.erb
<%= f.error_span(:done) %>
FALTA POUCO
Criar o arquivo
config/locales/task/pt-BR.yml com o
conteúdo
pt-BR:
tasks:
index:
title: 'Minhas tarefas'
new: 'Nova tarefa'
new:
title: 'Nova tarefa'
submit: 'Criar tarefa'
create:
title: 'Nova tarefa'
submit: 'Criar tarefa'
edit:
title: 'Editar tarefa'
submit: 'Atualizar tarefa'
update:
title: 'Editar tarefa'
form:
new: 'Criar tarefa'
create: 'Criar tarefa'
edit: 'Atualizar tarefa'
update: 'Atualizar tarefa'
activerecord:
attributes:
task:
id: 'ID'
name: 'Nome'
description: 'Descrição'
done: 'Finalizada'
created_at: 'Criada em'
FALTA POUCO
Adicionar em config/locales/application/pt-BR.yml
prohibited_from_being_saved:
one: '%{count} erro não permitiu que esse item fosse salvo'
other: '%{count} errors não permitiram que esse item fosse salvo’
Executar a aplicação e navegar a vontade
PASSO 15
Atualizando versão de produção
ATUALIZANDO VERSÃO DE PRODUÇÃO
Commitar Código
git add .
git commit –m “Changes on interface.”
Executar no console
git heroku push master
TERMINOU
Aplicação finalizada
OBRIGADO
/felipegruoso
/in/felipegruoso
felipe.gruoso@gmail.com
https://felipegruoso.herokuapp.com

Contenu connexe

Tendances

40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
Francisco Santos
 

Tendances (20)

Evoluindo bancos de dados com Flyway
Evoluindo bancos de dados com FlywayEvoluindo bancos de dados com Flyway
Evoluindo bancos de dados com Flyway
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Introdução ao Flyway
Introdução ao FlywayIntrodução ao Flyway
Introdução ao Flyway
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 
Cake Php
Cake PhpCake Php
Cake Php
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java Web
 
Introdução ao zend framework
Introdução ao zend frameworkIntrodução ao zend framework
Introdução ao zend framework
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
 
php orientado_a_objetos
php orientado_a_objetosphp orientado_a_objetos
php orientado_a_objetos
 
Laravel 5
Laravel 5Laravel 5
Laravel 5
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
 
Aula maven
Aula   mavenAula   maven
Aula maven
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e Hudson
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
ASP.NET 5 - Novidades do Desenvolvimento Web em .NET
ASP.NET 5 - Novidades do Desenvolvimento Web em .NETASP.NET 5 - Novidades do Desenvolvimento Web em .NET
ASP.NET 5 - Novidades do Desenvolvimento Web em .NET
 
ASP.NET 5, MVC 6 e além
ASP.NET 5, MVC 6 e alémASP.NET 5, MVC 6 e além
ASP.NET 5, MVC 6 e além
 

Similaire à Aula Ruby

Similaire à Aula Ruby (20)

Dockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechDockerizando aplicações em uma Fintech
Dockerizando aplicações em uma Fintech
 
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresasDockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.js
 
Curso rails
Curso railsCurso rails
Curso rails
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
Capistrano 3
Capistrano 3Capistrano 3
Capistrano 3
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
 
Bootcamp de Rails - CaquiCoders Meetup
Bootcamp de Rails - CaquiCoders MeetupBootcamp de Rails - CaquiCoders Meetup
Bootcamp de Rails - CaquiCoders Meetup
 
Introdução ao Ruby On Rails
Introdução ao Ruby On RailsIntrodução ao Ruby On Rails
Introdução ao Ruby On Rails
 
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais RobustoIonic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
 
Introdução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em RailsIntrodução á linguagem Ruby com aplicativo em Rails
Introdução á linguagem Ruby com aplicativo em Rails
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
 
PHP no Google AppEngine
PHP no Google AppEnginePHP no Google AppEngine
PHP no Google AppEngine
 
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetesk6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
 

Aula Ruby

  • 1. RUBY ON RAILS Criando uma aplicação do inicio ao fim
  • 2. APRESENTAÇÃO Felipe Gadelha Ruoso Pós-graduando em Desenvolvimento Web e Aplicativos Móveis 5 anos de experiência com Ruby Desenvolvedor Ruby na Tray RubyConf 2017 https://felipegruoso.herokuapp.com/
  • 3. COUNTEÚDO • Introdução • O que vamos construir? • Quais recursos vamos utilizar? • Testes • Deploy
  • 4. INTRODUÇÃO - RUBY Ruby é uma linguagem dinâmica, open source com foco na simplicidade e na produtividade. Tem uma sintaxe elegante de leitura natural e fácil escrita. Criado por: Yukihiro Matsumoto - Matz (1995) Versão atual: 2.3.5 https://www.ruby-lang.org/pt/
  • 5. INTRODUÇÃO - RAILS Rails é um framework para aplicações web baseado no modelo MVC. Contém tudo que é necessário para construir aplicações fantásticas de maneira simples e divertida. Criado por: David Heinemeier Hansson - DHH (2003) Versão atual: 5.1.4 http://rubyonrails.org/
  • 6. INTRODUÇÃO - GEM Gem é a abstração de um trecho de código ou conjunto de arquivos reutilizáveis etiquetadas com um nome e versão. Criado por: Nick Quaranto (2009) http://www.akitaonrails.com/2009/2/2/entendendo-rubygems https://rubygems.org/
  • 7. O QUE VAMOS CONSTRUIR? Vamos fazer algo simples e rápido! Nossa aplicação vai ser um gerenciador de tarefas, também conhecido como TODO List. Precisamos basicamente de: • Login de usuário; • Gerenciamento de Tarefas;
  • 8. QUAIS RECURSOS VAMOS UTILIZAR? Essa aplicação parece simples, porém, existe uma certa complexidade Controle de usuário – Devise (Gem - Engine) Controle de Idioma – Internacionalização (I18n) Testes - Rspec Deploy – Heroku Interface – Bootstrap (Gem)
  • 9. TESTES Manter a qualidade da sua aplicação é extremamente importante. Além de auxiliar na manutenção, ajuda na detecção de falhas (bugs) antes de sua publicação no mercado. TDD - Rspec (Gem) BDD – Cucumber (Gem) http://rspec.info/ https://cucumber.io/
  • 10. DEPLOY Deploy é o processo de publicação de uma aplicação. É nesse momento que seu código “vai para produção”. Heroku é uma plataforma cloud desenvolvida em Ruby preparada para hospedar aplicações de várias linguagens. Possui um ambiente customizável, de fácil utilização e oferece planos gratuitos. https://www.heroku.com/
  • 11. HANDS ON RAILS Vamos trabalhar...
  • 12. PASSO 1 Criando a aplicação
  • 13. CRIANDO A APLICAÇÃO Executar no console rails new todo_list -d mysql Criar banco de dados bundle exec rake db:create Rodar a aplicação rails s -p 3000 -b 0.0.0.0
  • 15. ALTERAR A GEM DE TESTES Adicionar em group :development, :test no Gemfile gem ‘rspec-rails’ Executar no console bundle install Remover a pasta test rm –rf test
  • 17. ADICIONANDO USUÁRIOS Adicionar no Gemfile gem 'devise’ Executar no console bundle install rails generate devise:install Seguir os passos 1 e 2 apresentados no console
  • 18. ADICIONANDO USUÁRIOS Criar model User rails generate devise user Executar alterações no banco de dados bundle exec rake db:migrate
  • 19. PASSO 3 Primeiro controller e primeira view
  • 20. PRIMEIRO CONTROLLER Criar controller home com action index rails g controller home index Executar a aplicação e acessar a rota ROOT localhost:3000
  • 21. PRIMEIRA VIEW Abrir o arquivo app/views/home/index.html.erb Substituir o conteúdo <h1>Bem-vindo ao Gerenciador de Tarefas</h1> Executar a aplicação e acessar a rota ROOT localhost:3000
  • 23. LINKS Adicionar em app/views/home/index.html.erb <%= link_to “Signin”, new_user_session_path %> <%= link_to “Signup”, new_user_registration_path %> Adicionar em app/views/devise/_links.html.erb <%= link_to “Home”, root_path %>
  • 24. LINKS Adicionar em app/helpers/application_helper.rb def signout_link return if current_user.blank? content_tag :li do link_to(“Logout”, destroy_user_session_path, method: :delete) end end Adicionar dentro da tag body em app/views/layouts/application.html.erb <%= signout_link %>
  • 26. CONHECENDO O I18N Adicionar no Gemfile gem 'rails-i18n’ Executar no console bundle install
  • 27. CONHECENDO O I18N Alterar arquivo config/application.rb config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*' ,'*.{rb,yml}').to_s] config.i18n.default_locale = :'pt-BR’ Substituir conteúdo do arquivo app/views/home/index.html.erb <h1><%= I18n.t('home.welcome') %></h1>
  • 28. CONHECENDO O I18N Adicionar arquivos config/locales/home/pt-BR.yml com o conteúdo pt-BR: home: welcome: 'Bem-vindo ao Gerenciador de Tarefas’ Executar a aplicação e acessar a rota ROOT localhost:3000
  • 30. CRIANDO TAREFAS Criar model task rails g scaffold task name:string description:string done:boolean user:references Atualizar banco de dados bundle exec rake db:migrate Adicionar relacionamento em app/model/user.rb has_many :tasks
  • 32. TESTES UNITÁRIOS Instalar o Rspec na aplicação rails generate rspec:install Executando testes bundle exec rspec
  • 33. TESTES UNITÁRIOS Criar arquivo spec/task_spec.rb com o conteúdo require 'rails_helper' describe Task, type: :model do before do User.create(email: 'user@gmail.com', password: '123456789') end context 'when all parameters are given' do let(:params) { { user: User.last, name: 'My Task', description: 'Teach Tests' } } it 'persists the task' do task = Task.create(params) expect(task).to be_persisted end end context 'when some parameter is missing' do let(:params) { { user: User.last } } it 'does not persist the task' do task = Task.create(params) expect(task).not_to be_persisted end end end
  • 35. VALIDAÇÕES Adicionar em app/models/task.rb validates :name, :description, presence: true Alterar action index em app/controllers/tasks_controller.rb @tasks = current_user.tasks Alterar action new em app/controllers/tasks_controller.rb @task = current_user.tasks.new
  • 36. VALIDAÇÕES Alterar action create em app/controllers/tasks_controller.rb @task = current_user.tasks.new(task_params) Alterar set_task em app/controllers/tasks_controller.rb @task = Task.find_by!(id: params[:id], user_id: current_user.id) Alterar task_params em app/controllers/tasks_controller.rb params.require(:task).permit(:name, :description, :done)
  • 38. PERMISSÕES DE ACESSO Pedir autenticação de usuário em app/controllers/application_controller.rb before_action :authenticate_user! Ignorar autenticação de usuário em app/controllers/home_controller.rb skip_before_action :authenticate_user!
  • 40. DEPLOY Criar conta no heroku https://signup.heroku.com Instalar Heroku-CLI https://devcenter.heroku.com/articles/heroku-cli#download-and-install Criar uma aplicação https://dashboard.heroku.com/new-app
  • 41. DEPLOY Executar no console cd path/to/app Realizar autenticação no heroku heroku login Inserir suas credenciais de acesso
  • 42. DEPLOY Selecionar a forma que deseja realizar o deploy e seguir os passos https://dashboard.heroku.com/apps/new-blog-teste/deploy/heroku-git Para esse exemplo, vamos usar o git. Executar no console git init Adicionar referência do heroku como remote executando no console heroku git:remote -a app-name
  • 43. DEPLOY Adicionar addon gratuito de banco de dados no heroku executando no console heroku addons:create cleardb:ignite Recuperar URL do banco de daods adicionado. Executar no console heroku config | grep CLEARDB_DATABASE_URL O retorno do comando anterior será algo nesse formato CLEARDB_DATABASE_URL: mysql://user:pass@host.cleardb.net...
  • 44. DEPLOY Para que o heroku se conecte no banco, é necessário atribuir a variável de ambiente DATABASE_URL Executar no console heroku config:set DATABASE_URL=‘mysql2://user:pass@host.cleardb.net...’ ATENÇÃO: Alterar mysql:// para mysql2:// Pelo console, executar migrations no banco de dados heroku run rake db:migrate
  • 45. DEPLOY Executar o seguinte comando no console para visualizar a URL de acesso da sua aplicação heroku apps:open Manually visit https://app-name.herokuapp.com in your browser.
  • 47. MUDANDO O VISUAL Adicionar no Gemfile gem 'twitter-bootstrap-rails' gem 'devise-bootstrap-views' gem 'jquery-rails’ Executar no console bundle install
  • 48. MUDANDO O VISUAL Adicionar em cima do primeiro require em app/assets/javascripts/application.js //= require twitter/bootstrap Adicionar arquivos do bootstrap na aplicação rails generate bootstrap:install static
  • 49. CRIANDO TAREFAS Personalizar views de tarefas com bootstrap rails g bootstrap:themed Tasks Remover app/assets/stylesheets/scaffolds.scss
  • 50. MUDANDO O VISUAL Criar arquivo config/locales/pt-BR.bootstrap.yml com o conteúdo pt-BR: breadcrumbs: application: root: "Início" pages: pages: "Páginas" helpers: actions: "Ações" links: back: "Voltar" cancel: "Cancelar" confirm: "Tem certeza?" destroy: "Excluir" new: "Novo" edit: "Editar" show: "Detalhes" titles: edit: "Editar %{model}" save: "Salvar %{model}" new: "Novo %{model}" delete: "Excluir %{model}"
  • 51. MUDANDO O VISUAL Adicionar em cima do primeiro require em app/assets/stylesheets/application.css *= require devise_bootstrap_views Gerar locales para views do devise rails g devise:views:locale pt-BR
  • 52. MUDANDO O VISUAL Personalizando layout principal rails g bootstrap:layout application Personalizando layouts do devise rails g devise:views:bootstrap_templates
  • 53. MUDANDO O VISUAL Comentar as tags favicon_link_tag nas linhas 14, 18, 22, 26 e 30 do arquivo app/views/layout/application.html.erb <%#= favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple- touch-icon-precomposed', :type => 'image/png', :sizes => '144x144’ %> … <%#= favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple- touch-icon-precomposed', :type => 'image/png', :sizes => '114x114’ %> … <%#= favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch- icon-precomposed', :type => 'image/png', :sizes => '72x72’ %> … <%#= favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon- precomposed', :type => 'image/png' %> … <%#= favicon_link_tag 'favicon.ico', :rel => 'shortcut icon' %>
  • 54. PASSO 12 Ficando mais bonito ainda
  • 55. FICANDO MAIS BONITO AINDA Substituir container do layout app/views/layouts/application.html.erb <div class="container"> <div class="row"> <div class="col-lg-12"> <%= bootstrap_flash %> <%= yield %> </div> </div><!--/row--> </div> <!-- /container -->
  • 56. FICANDO MAIS BONITO AINDA Substituir o element ul do layout app/views/layouts/application.html.erb <ul class="nav navbar-nav"> <%= signout_link %> </ul> Substituir link do layout app/views/layouts/application.html.erb <a class="navbar-brand" href="/">Todo List</a>
  • 57. FICANDO MAIS BONITO AINDA Substituir link em app/helpers/application_helper.rb link_to(I18n.t('application.signout'), destroy_user_session_path, method: :delete)
  • 58. FICANDO MAIS BONITO AINDA Adicionando links de login e cadastro em app/views/home/index.html.erb <%= link_to I18n.t('application.signin'), new_user_session_path, class: 'btn btn-default' %> <%= link_to I18n.t('application.signup'), new_user_registration_path, class: 'btn btn-primary’ %> Adicionar I18n config/locales/application/pt-BR.yml pt-BR: application: signout: 'Sair' signin: 'Entrar' signup: 'Cadastrar'
  • 60. AJUSTANDO VIEWS Remover campo user_id em app/views/tasks/_form.html.erb <div class="form-group"> <%= f.label :user_id, :class => 'control-label col-lg-2' %> <div class="col-lg-10"> <%= f.text_field :user_id, :class => 'form-control' %> </div> <%=f.error_span(:user_id) %> </div>
  • 61. AJUSTANDO VIEWS Alterar campo done em app/views/tasks/_form.html.erb <div class="form-group"> <%= f.label :done, :class => 'control-label col-lg-2' %> <div class="col-lg-10"> <div class="checkbox"> <label><%= f.check_box :done %></label> </div> </div> <%=f.error_span(:done) %> </div>
  • 62. AJUSTANDO VIEWS Remover campo user_id em app/views/tasks/show.html.erb <dt><strong><%= model_class.human_attribute_name(:user_id) %>:</strong></dt> <dd><%= @task.user_id %></dd> Remover campo user_id em app/views/tasks/index.html.erb <th><%= model_class.human_attribute_name(:user_id) %></th> ... <td><%= task.user_id %></td>
  • 64. FALTA POUCO Alterar botão em app/views/tasks/_form.html.erb <%= f.submit t('.' + action_name), :class => 'btn btn-primary’ %> Alterar mensagem de erro em app/views/tasks/_form.html.erb <h3 class="panel-title"><%= t('application.prohibited_from_being_saved', count: @task.errors.count) %>:</h3> Mover error_span para dentro da div col em app/views/tasks/_form.html.erb <%= f.error_span(:done) %>
  • 65. FALTA POUCO Criar o arquivo config/locales/task/pt-BR.yml com o conteúdo pt-BR: tasks: index: title: 'Minhas tarefas' new: 'Nova tarefa' new: title: 'Nova tarefa' submit: 'Criar tarefa' create: title: 'Nova tarefa' submit: 'Criar tarefa' edit: title: 'Editar tarefa' submit: 'Atualizar tarefa' update: title: 'Editar tarefa' form: new: 'Criar tarefa' create: 'Criar tarefa' edit: 'Atualizar tarefa' update: 'Atualizar tarefa' activerecord: attributes: task: id: 'ID' name: 'Nome' description: 'Descrição' done: 'Finalizada' created_at: 'Criada em'
  • 66. FALTA POUCO Adicionar em config/locales/application/pt-BR.yml prohibited_from_being_saved: one: '%{count} erro não permitiu que esse item fosse salvo' other: '%{count} errors não permitiram que esse item fosse salvo’ Executar a aplicação e navegar a vontade
  • 68. ATUALIZANDO VERSÃO DE PRODUÇÃO Commitar Código git add . git commit –m “Changes on interface.” Executar no console git heroku push master