Devise é uma gem responsável por cuidar de todo o modelo de usuário. Isso quer dizer que:
São algumas das coisas tratadas por Devise.
Instalação
#Gemfile
gem 'devise'# Terminal
bundle install
rails generate devise:install
Criação de Usuário
# Terminal
# repare que não é 'generate model', mas 'generate devise'
rails g devise User atributo1:tipo1 atributo2:tipo2
rails db:migrateNão se preocupe em gerar campos de email e senha, o devise gera automaticamente. Dê uma olhada em db/migrate/#####_devise_create_users.rb
Permitindo parâmetros customizados
É necessário realizar uma configuração especial para permitir (strong params) atributos do User que não foram criados pelo próprio Devise
Permitindo parâmetros customizados
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
# For additional fields in app/views/devise/registrations/new.html.erb
devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
# For additional in app/views/devise/registrations/edit.html.erb
devise_parameter_sanitizer.permit(:account_update, keys: [:username])
end
end
Copie e cole o código abaixo em app/controllers/application_controller.rb
Ajuste os parâmetros que gostaria que o usuário cadastrasse (new) ou editasse (edit)
Agora só precisamos arrumar o front end
Temos novas rotas com o devise!
Vamos nos preocupar com new_user_session_path (login) e destroy_user_session_path (logout)
Faremos uma navbar que terá o link para login (quando o usuário não estiver logado) e o link para logout (quando o usuário estiver logado).
Bônus! Para melhorar nosso estilo de forma rápida, utilizaremos bootstrap! Para isso, siga as instruções de instalação do bootstrap aqui
Crie uma homepage. Isso é necessário para o bom funcionamento de Devise, como apontado pela própria gem após sua instalação.
# config/routes.rb
# ...
root to: 'controller#action'
# ...Desenhe a navbar. Ela pode ser do jeito que preferir. Um exemplo segue abaixo:
<div class="border-bottom">
<div class="container p-2 d-flex justify-content-between
align-items-center">
<span>Hello World</span>
<%= link_to 'Login', new_user_session_path, class:
'btn btn-primary' %>
<%= link_to 'Logout', destroy_user_session_path,
method: :delete, class: 'btn btn-danger' %>
</div>
</div>
O botão de login deve aparecer somente quando não houver um usuário logado, caso contrário é o botão de logout que deve aparecer. Felizemente, Devise nos oferece um método para saber se, naquele momento, o usuário está logado ou não:
user_signed_in?
<div class="border-bottom">
<div class="container p-2 d-flex justify-content-between
align-items-center">
<span>Hello World</span>
<% if !user_signed_in? %>
<%= link_to 'Login', new_user_session_path, class:
'btn btn-primary' %>
<% else %>
<%= link_to 'Logout', destroy_user_session_path,
method: :delete, class: 'btn btn-danger' %>
<% end %>
</div>
</div>
Todas as outras rotas já estão devidamente configuradas. Caso queira ajustar seus designs, basta executar no terminal
rails g devise:viewsOs arquivos de view de cada página serão mostrados na pasta para que possa alterá-los
Também podemos acessar as informações do usuário logado com outra ferramenta fornecida pelo Devise:
current_user
Esse método nos retorna o User corrente logado na máquina.
<div class="border-bottom">
<div class="container p-2 d-flex justify-content-between
align-items-center">
<span>Hello World</span>
<% if !user_signed_in? %>
<%= link_to 'Login', new_user_session_path, class:
'btn btn-primary' %>
<% else %>
<div class="d-flex align-items-center">
<%= current_user.email %>
<%= link_to 'Logout', destroy_user_session_path,
method: :delete, class: 'ml-2 btn btn-danger' %>
</div>
<% end %>
</div>
</div>
Pedaços de views presentes em mais de uma página
Caso tenhamos componentes idênticos em várias páginas diferentes (navbars e footers, por exemplo), podemos criar um único arquivo para cada componente e reutilizá-los nas páginas que os queremos presentes. A esses arquivos damos o nome de partials
Criação de uma partial
Uma partial genérica, presente em views de vários controllers diferentes, é comumente armazenada numa nova pasta, views/shared. Caso a partial seja utilizada em várias views de um único controller, a partial pode ser criada na pasta de views daquele controller.
Criação de uma partial
Vamos criar a partial para navbar. Sendo bastante genérica, iremos armazená-la na pasta shared/
<!-- app/views/shared/_navbar.html.erb -->
<div class="border-bottom">
<div class="container p-2 d-flex justify-content-between
align-items-center">
<span>Hello World</span>
<% if !user_signed_in? %>
<%= link_to 'Login', new_user_session_path, class:
'btn btn-primary' %>
<% else %>
<%= link_to 'Logout', destroy_user_session_path,
method: :delete, class: 'btn btn-danger' %>
<% end %>
</div>
</div>Utilização de uma partial
Para utilizá-la em qualquer página, basta utilizar
<%= render 'shared/nabvar' %>Na view onde gostaria. Essa linha deve ser implementada exatamente onde você implementaria o código presente na partial
Perceba que o '_' não está presente!!!
Outras partial importante
Talvez tenha reparado, nas instruções após a instalação do Devise, que o mesmo requer "flash messages" no layout. Ao invés de cumprir tal instrução, crie a partial do slide a seguir
Outras partial importante
<!-- app/views/shared/_flashes.html.erb -->
<% if notice %>
<div class="alert alert-info alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert"
aria-label="Close"><span aria-hidden="true">×</span></button>
<%= notice %>
</div>
<% end %>
<% if alert %>
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert"
aria-label="Close"><span aria-hidden="true">×</span></button>
<%= alert %>
</div>
<% end %>Outras partial importante
Em seguida, renderize-o em app/views/layout/application.html.erb
<!DOCTYPE html>
<html>
<head>
<!-- ... -->
</head>
<body>
<%= render 'shared/flashes' %>
<%= yield %>
</body>
</html>
Instalação
# OS X
brew install heroku/brew/heroku# Linux
wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | shDepois de criar sua conta no site, faça login em seu terminal com o comando
heroku loginHeroku funciona da mesma forma que Github!
heroku create app-namePara criar um novo repositório pelo terminal (e conectá-lo ao projeto):
Para enviar seu projeto local ao repositório:
git push heroku masterAtenção!
Heroku não suporta sqlite3! Para enviar seu projeto, o mesmo deve utilizar algum outro SGBD, como Postgres.
rails new app_name --database=postgresqlCaso já tenha um projeto feito com sqlite e deseja alterar o SGBD, veja aqui como fazer isso.