Adding e-mail confirmations
parent
b3c7c8700d
commit
fc198a8b4c
|
@ -104,6 +104,7 @@ body {
|
||||||
.logo-container {
|
.logo-container {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
margin: 100px auto;
|
margin: 100px auto;
|
||||||
|
margin-bottom: 0;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
|
|
||||||
@media screen and (max-width: 360px) {
|
@media screen and (max-width: 360px) {
|
||||||
|
@ -276,6 +277,13 @@ body {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flash-message {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
.form-footer {
|
.form-footer {
|
||||||
margin-top: 30px;
|
margin-top: 30px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
|
@ -10,7 +10,7 @@ class ApplicationController < ActionController::Base
|
||||||
rescue_from ActionController::RoutingError, with: :not_found
|
rescue_from ActionController::RoutingError, with: :not_found
|
||||||
rescue_from ActiveRecord::RecordNotFound, with: :not_found
|
rescue_from ActiveRecord::RecordNotFound, with: :not_found
|
||||||
|
|
||||||
before_filter :store_current_location, :unless => :devise_controller?
|
before_action :store_current_location, :unless => :devise_controller?
|
||||||
|
|
||||||
def raise_not_found
|
def raise_not_found
|
||||||
raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}"
|
raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}"
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
|
layout 'auth'
|
||||||
|
end
|
|
@ -12,6 +12,12 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def after_sign_in_path_for(_resource)
|
def after_sign_in_path_for(_resource)
|
||||||
stored_location_for(:user) || root_path
|
last_url = stored_location_for(:user)
|
||||||
|
|
||||||
|
if [about_path].include?(last_url)
|
||||||
|
root_path
|
||||||
|
else
|
||||||
|
last_url || root_path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
class User < ApplicationRecord
|
class User < ApplicationRecord
|
||||||
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
|
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
|
||||||
|
|
||||||
belongs_to :account, inverse_of: :user
|
belongs_to :account, inverse_of: :user
|
||||||
accepts_nested_attributes_for :account
|
accepts_nested_attributes_for :account
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f|
|
||||||
|
= devise_error_messages!
|
||||||
|
|
||||||
|
.field
|
||||||
|
= f.email_field :email, autofocus: true, required: true, placeholder: 'E-mail address'
|
||||||
|
.actions
|
||||||
|
= f.button "Resend confirmation instructions", type: 'submit'
|
||||||
|
|
||||||
|
.form-footer= render "auth/shared/links"
|
|
@ -0,0 +1,5 @@
|
||||||
|
<p>Welcome <%= @resource.email %>!</p>
|
||||||
|
|
||||||
|
<p>You can confirm your account email through the link below:</p>
|
||||||
|
|
||||||
|
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
|
|
@ -1,25 +0,0 @@
|
||||||
<h2>Change your password</h2>
|
|
||||||
|
|
||||||
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
|
|
||||||
<%= devise_error_messages! %>
|
|
||||||
<%= f.hidden_field :reset_password_token %>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<%= f.label :password, "New password" %><br />
|
|
||||||
<% if @minimum_password_length %>
|
|
||||||
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
|
|
||||||
<% end %>
|
|
||||||
<%= f.password_field :password, autofocus: true, autocomplete: "off" %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<%= f.label :password_confirmation, "Confirm new password" %><br />
|
|
||||||
<%= f.password_field :password_confirmation, autocomplete: "off" %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="actions">
|
|
||||||
<%= f.submit "Change my password" %>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<%= render "devise/shared/links" %>
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
|
||||||
|
= devise_error_messages!
|
||||||
|
= f.hidden_field :reset_password_token
|
||||||
|
|
||||||
|
.field
|
||||||
|
= f.password_field :password, autofocus: true, autocomplete: "off", placeholder: 'New password'
|
||||||
|
.field
|
||||||
|
= f.password_field :password_confirmation, autocomplete: "off", placeholder: 'Confirm new password'
|
||||||
|
.actions
|
||||||
|
= f.button "Change my password", type: :submit
|
||||||
|
|
||||||
|
= render "devise/shared/links"
|
|
@ -13,7 +13,3 @@
|
||||||
|
|
||||||
- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks'
|
- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks'
|
||||||
%li= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name)
|
%li= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name)
|
||||||
|
|
||||||
- if devise_mapping.omniauthable?
|
|
||||||
- resource_class.omniauth_providers.each do |provider|
|
|
||||||
%li= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider)
|
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
%small= Rails.configuration.x.local_domain
|
%small= Rails.configuration.x.local_domain
|
||||||
|
|
||||||
.form-container
|
.form-container
|
||||||
|
- if flash[:notice]
|
||||||
|
.flash-message.notice= flash[:notice]
|
||||||
|
|
||||||
|
- if flash[:alert]
|
||||||
|
.flash-message.alert= flash[:alert]
|
||||||
|
|
||||||
= yield
|
= yield
|
||||||
|
|
||||||
= render template: "layouts/application"
|
= render template: "layouts/application"
|
||||||
|
|
|
@ -15,7 +15,8 @@ Rails.application.routes.draw do
|
||||||
devise_for :users, path: 'auth', controllers: {
|
devise_for :users, path: 'auth', controllers: {
|
||||||
sessions: 'auth/sessions',
|
sessions: 'auth/sessions',
|
||||||
registrations: 'auth/registrations',
|
registrations: 'auth/registrations',
|
||||||
passwords: 'auth/passwords'
|
passwords: 'auth/passwords',
|
||||||
|
confirmations: 'auth/confirmations'
|
||||||
}
|
}
|
||||||
|
|
||||||
resources :accounts, path: 'users', only: [:show], param: :username do
|
resources :accounts, path: 'users', only: [:show], param: :username do
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class AddConfirmableToUsers < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
add_column :users, :confirmation_token, :string
|
||||||
|
add_column :users, :confirmed_at, :datetime
|
||||||
|
add_column :users, :confirmation_sent_at, :datetime
|
||||||
|
add_column :users, :unconfirmed_email, :string
|
||||||
|
add_index :users, :confirmation_token, unique: true
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20160926213048) do
|
ActiveRecord::Schema.define(version: 20161003142332) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -158,7 +158,12 @@ ActiveRecord::Schema.define(version: 20160926213048) do
|
||||||
t.inet "current_sign_in_ip"
|
t.inet "current_sign_in_ip"
|
||||||
t.inet "last_sign_in_ip"
|
t.inet "last_sign_in_ip"
|
||||||
t.boolean "admin", default: false
|
t.boolean "admin", default: false
|
||||||
|
t.string "confirmation_token"
|
||||||
|
t.datetime "confirmed_at"
|
||||||
|
t.datetime "confirmation_sent_at"
|
||||||
|
t.string "unconfirmed_email"
|
||||||
t.index ["account_id"], name: "index_users_on_account_id", using: :btree
|
t.index ["account_id"], name: "index_users_on_account_id", using: :btree
|
||||||
|
t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
|
||||||
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
|
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
|
||||||
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
|
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
Fabricator(:user) do
|
Fabricator(:user) do
|
||||||
account
|
account
|
||||||
email "alice@example.com"
|
email "alice@example.com"
|
||||||
password "123456789"
|
password "123456789"
|
||||||
|
confirmed_at { Time.now }
|
||||||
end
|
end
|
||||||
|
|
Reference in New Issue