Commit 7f1f8cc9 by Van Hau Le

Merge branch 'register' into 'master'

Register

See merge request !10
parents 7a3a01c3 f899b54c
Pipeline #1007 failed with stages
in 0 seconds
......@@ -29,3 +29,5 @@
# Ignore master key for decrypting credentials and more.
/config/master.key
config/local_env.yml
......@@ -32,6 +32,7 @@ gem 'whenever', require: false
# Use ActiveStorage variant
# gem 'mini_magick', '~> 4.8'
gem 'rubocop', '~> 0.88.0', require: false
gem 'config'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
gem 'kaminari'
......
......@@ -83,10 +83,52 @@ GEM
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.6)
config (2.2.1)
deep_merge (~> 1.2, >= 1.2.1)
dry-validation (~> 1.0, >= 1.0.0)
connection_pool (2.2.3)
crass (1.0.6)
deep_merge (1.2.1)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dry-configurable (0.11.6)
concurrent-ruby (~> 1.0)
dry-core (~> 0.4, >= 0.4.7)
dry-equalizer (~> 0.2)
dry-container (0.7.2)
concurrent-ruby (~> 1.0)
dry-configurable (~> 0.1, >= 0.1.3)
dry-core (0.4.9)
concurrent-ruby (~> 1.0)
dry-equalizer (0.3.0)
dry-inflector (0.2.0)
dry-initializer (3.0.3)
dry-logic (1.0.7)
concurrent-ruby (~> 1.0)
dry-core (~> 0.2)
dry-equalizer (~> 0.2)
dry-schema (1.5.3)
concurrent-ruby (~> 1.0)
dry-configurable (~> 0.8, >= 0.8.3)
dry-core (~> 0.4)
dry-equalizer (~> 0.2)
dry-initializer (~> 3.0)
dry-logic (~> 1.0)
dry-types (~> 1.4)
dry-types (1.4.0)
concurrent-ruby (~> 1.0)
dry-container (~> 0.3)
dry-core (~> 0.4, >= 0.4.4)
dry-equalizer (~> 0.3)
dry-inflector (~> 0.1, >= 0.1.2)
dry-logic (~> 1.0, >= 1.0.2)
dry-validation (1.5.4)
concurrent-ruby (~> 1.0)
dry-container (~> 0.7, >= 0.7.1)
dry-core (~> 0.4)
dry-equalizer (~> 0.2)
dry-initializer (~> 3.0)
dry-schema (~> 1.5)
erubi (1.9.0)
execjs (2.7.0)
ffi (1.13.1)
......@@ -274,6 +316,7 @@ DEPENDENCIES
carrierwave (= 2.1.0)
chromedriver-helper
coffee-rails (~> 4.2)
config
jbuilder (~> 2.5)
kaminari
listen (>= 3.0.5, < 3.2)
......
......@@ -2,11 +2,11 @@
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
.email-field, .password-field, .name-field, .forgot-pass-field, .cv-field, .new-password-field, .old-password-field {
.email-field, .password-field, .name-field, .forgot-pass-field, .cv-field, .new-password-field, .old-password-field, .password-confirmation-field {
margin: 20px;
padding: 10px;
}
.input-email, .input-name, .input-cv, .input-new-password, .input-password {
.input-email, .input-name, .input-cv, .input-new-password, .input-password, .input-password-confirmation {
width: 300px;
}
.login-btn, .regis-btn, .update-btn, .my-jobs-btn {
......
.label {
font-size: 32px;
padding: 20px;
margin: 30px;
}
.email-text {
font-size: 24px;
}
.confirm-email-btn {
padding: 20px;
margin: 30px;
}
.confirm {
height: 150px;
width: 300px;
}
.text-confirm {
font-size: 26px;
}
class ConfirmationsController < ApplicationController
def new
end
def mail_register
email = params[:confirmation][:email].downcase
if User.find_by(email: email)
flash[:danger] = Settings.user.sign_up.existed
redirect_to register_step1_path
end
@user = Confirmation.find_or_initialize_by(email: email)
unless @user.save
flash[:danger] = Settings.user.sign_up.format_failed
return redirect_to register_step1_path
end
ConfirmationMailer.register_email(@user).deliver_later
end
end
class ResetPasswordsController < ApplicationController
before_action :find_token_param, only: [:edit]
def reset_password
end
def sending_email
@user = User.find_by(email: params[:reset_password][:email].downcase)
unless @user
flash[:danger] = Settings.user.reset_password.failed
else
forgot_token = Digest::SHA1.hexdigest(SecureRandom.urlsafe_base64)
@user.update_attribute(:remember_token, forgot_token)
ResetPasswordMailer.reset_password(@user).deliver_later
flash[:success] = Settings.user.reset_password.success
end
redirect_to reset_password_step1_path
end
def edit
@user = User.find_by(remember_token: params[:token])
return redirect_to reset_password_step1_path unless @user
if @user.token_expired?
flash[:danger] = Settings.user.expiration
redirect_to register_step1_path
end
end
def update
@user = User.find_by(email: params[:user][:email])
if @user.update_attributes(forgot_pass_params)
sign_in @user
flash[:success] = Settings.general_notify.update_success
redirect_to my_page_path
else
flash[:danger] = Settings.user.reset_password.update_reset_pass
redirect_to reset_password_final_path(token: @user.remember_token)
end
end
private
def find_token_param
return redirect_to reset_password_step1_path unless params[:token]
end
def forgot_pass_params
params.require(:user).permit( :password, :password_confirmation)
end
end
......@@ -10,7 +10,7 @@ class SessionsController < ApplicationController
sign_in user
redirect_to my_page_path
else
flash.now[:danger] = 'Invalid email or password'
flash.now[:danger] = Settings.user.sign_in.failed
render 'new'
end
end
......
class UsersController < ApplicationController
before_action :sign_in_validation, only: [:update, :my_page, :my_info]
def my_page
end
......@@ -10,18 +11,36 @@ class UsersController < ApplicationController
if current_user.authenticate(params[:user][:password])
return respond_to { |format| format.js } unless current_user.update_attributes(user_params)
flash[:success] = 'Updated Successfully'
flash[:success] = Settings.general_notify.update_success
redirect_to my_page_path
else
flash.now[:danger] = 'Password is mismatch'
flash.now[:danger] = Settings.user.password_mismatch
end
end
def registation
@email = Confirmation.find_by(confirm_token: params[:code])
return redirect_to register_step1_path unless @email
if @email.token_expired?
flash[:danger] = Settings.user.expiration
redirect_to register_step1_path
else
@user = User.new
end
end
def create
@user = User.new(sign_up_params)
return respond_to { |format| format.js } unless @user.save
sign_in @user
redirect_to my_page_path
end
private
def sign_in_validation
return if signed_in?
flash[:warning] = "Please Sign In..."
flash[:warning] = Settings.user.warning_signin
redirect_to login_path
end
......@@ -33,4 +52,8 @@ class UsersController < ApplicationController
def change_pass_param
params.require(:user).permit(:new_password)
end
def sign_up_params
params.require(:user).permit(:name, :email, :cv_user, :password, :password_confirmation)
end
end
......@@ -16,6 +16,7 @@ module SessionsHelper
end
def current_user
return if cookies[:remember_token].blank?
remember_token = User.digest(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end
......@@ -25,4 +26,5 @@ module SessionsHelper
cookies.delete(:remember_token)
self.current_user = nil
end
end
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
default from: 'phuoc2811006@gmail.com'
layout 'mailer'
end
class ConfirmationMailer < ActionMailer::Base
def register_email(user)
@user = user
mail(to: user.email, subject: 'Welcome To VeNJOB! Confirm Your Email')
end
end
class ResetPasswordMailer < ActionMailer::Base
def reset_password(user)
@user = user
mail(to: user.email, subject: 'VeNJOB Password Assistance')
end
end
class Confirmation < ApplicationRecord
before_save { self.email = email.downcase }
before_save :create_confirm_token
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 200 },
format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
def self.confirm_token
SecureRandom.urlsafe_base64
end
def self.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_confirm_token
self.confirm_token = Confirmation.digest(Confirmation.confirm_token)
end
end
......@@ -12,12 +12,12 @@ class User < ApplicationRecord
has_secure_password
validates :name, presence: true, length: { maximum: 50 }
validates :name, presence: true, length: { maximum: 200 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :email, presence: true, length: { maximum: 200 },
format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
PASSWORD_FORMAT = /\A(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/x
PASSWORD_FORMAT = /\A(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/x
validates :password, format: { with: PASSWORD_FORMAT, message: "is too short or not strength" }
def self.new_remember_token
......@@ -28,6 +28,10 @@ class User < ApplicationRecord
Digest::SHA1.hexdigest(token.to_s)
end
def token_expired?
updated_at <= 24.hours.ago
end
private
def create_remember_token
......
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Welcome <%= @user.email %></h1>
<p>You're on your way!</p>
<p>Let's confirm your email address.</p>
<p>By clicking on the following link, you are confirming your email address and agreeing to VeNJOB's Terms of Service.</p>
<p><%= link_to 'Confirm Email', registation_url(code: @user.confirm_token) %></p>
</body>
</html>
<div class="container">
<div class="text-center label">
<strong>Register</strong>
</div>
<div class="row">
<div class="text-center waiting-text col-12">
Thank you for register our service, an confirmation email with registration link<br>
has been sent to your email. Please check your email within 24 hours.<br>
Please note that the registration link is only valid for 24 hours.<br>
Over that period, you will have to register your email again.
</div>
</div>
</div>
<div class="container">
<%= render 'layouts/flash' %>
<div class="text-center label">
<strong>Register</strong>
</div>
<div class="form-register">
<%= form_for(:confirmation, url: register_step2_path) do |f| %>
<div class="validation"></div>
<div class="text-center email-input">
<strong>Email</strong>
<%= f.text_field :email %>
</div>
<div class="text-center confirm-email-btn">
<%= f.submit 'Confirm your email', class: 'btn btn-outline-danger confirm font-weight-bold' %>
</div>
<% end %>
</div>
</div>
......@@ -9,7 +9,7 @@
<li><%= link_to "Log Out", logout_path , class: "nav-item nav-link", method: "delete" %></li>
<% else %>
<li><%= link_to "Log In", login_path , class: "nav-item nav-link" %></li>
<li><%= link_to "Register", '#', class: "nav-item nav-link" %></li>
<li><%= link_to "Register", register_step1_path, class: "nav-item nav-link" %></li>
<% end %>
<li><%= link_to "Favorite", '#', class: "nav-item nav-link" %></li>
<li><%= link_to "History", '#', class: "nav-item nav-link" %></li>
......
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<p>We received a request to reset the password associated with this e-mail address. If you made this request, please follow the instructions below.</p>
<p>Click the link below to reset your password using our secure server:</p>
<p><%= link_to 'Reset password', reset_password_final_url(token: @user.remember_token) %></p>
<p>If you did not request to have your password reset you can safely ignore this email. Rest assured your account is safe.</p>
<p>Please also be noted that the above link is valid for 24 hours.</p>
<p>Best,</p>
</body>
</html>
<div class="container">
<%= render 'layouts/flash' %>
<h1 class="text-center my-page-label">Forgot password</h1>
<div class="form-login">
<div class="row form d-flex justify-content-center">
<%= form_for(@user, url: update_forgot_pass_path) do |f| %>
<div class="validation"></div>
<div class="email-field">
<div class="col-4-sm">
<%= f.label :email %>
</div>
<div class="col-8-sm">
<%= f.text_field :email, class: 'input-email', value: @user.email, readonly: true %>
</div>
</div>
<div class="password-field">
<div class="col-4-sm">
<%= f.label :password, 'Password' %>
</div>
<div class="col-8-sm">
<%= f.password_field :password, class: 'input-password' %>
</div>
</div>
<div class="password-confirmation-field">
<div class="col-4-sm">
<%= f.label :password_confirmation, 'Password Confirmation' %>
</div>
<div class="col-8-sm">
<%= f.password_field :password_confirmation, class: 'input-password-confirmation' %>
</div>
</div>
<%= f.submit 'Submit', class: 'btn btn-outline-primary btn-lg update-btn' %>
<% end %>
</div>
</div>
</div>
<div class="container">
<%= render 'layouts/flash' %>
<div class="text-center label">
<strong>Forgot password</strong>
</div>
<div class="form-register">
<%= form_for(:reset_password, url: reset_password_step2_path) do |f| %>
<div class="validation"></div>
<div class="text-center email-input">
<strong>Email</strong>
<%= f.text_field :email %>
</div>
<div class="text-center confirm-email-btn">
<%= f.submit 'Confirm your email', class: 'btn btn-outline-danger confirm font-weight-bold' %>
</div>
<% end %>
</div>
</div>
......@@ -22,11 +22,11 @@
</div>
</div>
<div class="col-6-sm forgot-pass-field">
<%= link_to 'Forgot password?', '#' %>
<%= link_to 'Forgot password?', reset_password_step1_path %>
</div>
<%= f.submit 'Login', class: 'btn btn-outline-primary btn-lg login-btn' %>
<%= link_to 'Register', '#', class: 'btn btn-outline-info btn-lg regis-btn' %>
<%= link_to 'Register', register_step1_path, class: 'btn btn-outline-info btn-lg regis-btn' %>
<% end %>
</div>
</div>
......
$(".validation").html("<%=escape_javascript render(:partial => 'shared/error_messages') %>");
......@@ -9,7 +9,7 @@
<%= f.label :email %>
</div>
<div class="col-8-sm">
<%= f.text_field :email, class: 'input-email' %>
<strong><%= current_user.email %></strong>
</div>
</div>
<div class="name-field">
......@@ -17,7 +17,7 @@
<%= f.label :name, 'Full Name' %>
</div>
<div class="col-8-sm">
<%= f.text_field :name, class: 'input-name' %>
<strong><%= current_user.name %></strong>
</div>
</div>
<div class="cv-field">
......
<div class="container">
<h1 class="text-center my-page-label">Register</h1>
<div class="form-login">
<div class="row form d-flex justify-content-center">
<%= form_for(@user, remote: true) do |f| %>
<div class="validation"></div>
<div class="email-field">
<div class="col-4-sm">
<%= f.label :email %>
</div>
<div class="col-8-sm">
<%= f.text_field :email, class: 'input-email', value: @email.email %>
</div>
</div>
<div class="name-field">
<div class="col-4-sm">
<%= f.label :name, 'Full Name' %>
</div>
<div class="col-8-sm">
<%= f.text_field :name, class: 'input-name' %>
</div>
</div>
<div class="password-field">
<div class="col-4-sm">
<%= f.label :password, 'Password' %>
</div>
<div class="col-8-sm">
<%= f.password_field :password, class: 'input-password' %>
</div>
</div>
<div class="password-confirmation-field">
<div class="col-4-sm">
<%= f.label :password_confirmation, 'Password Confirmation' %>
</div>
<div class="col-8-sm">
<%= f.password_field :password_confirmation, class: 'input-password-confirmation' %>
</div>
</div>
<div class="cv-field">
<div class="col-4-sm">
<%= f.label :cv_user, 'My CV' %>
</div>
<div class="col-8-sm">
<%= f.file_field :cv_user, accept: '.doc, .pdf, .xls, .xlsx, .zip',class: 'input-cv' %>
</div>
</div>
<%= f.submit 'Register', class: 'btn btn-outline-primary btn-lg update-btn' %>
<% end %>
</div>
</div>
</div>
......@@ -10,6 +10,12 @@ module Venjob
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.2
config.before_configuration do
env_file = File.join(Rails.root, 'config', 'local_env.yml')
YAML.load(File.open(env_file)).each do |key, value|
ENV[key.to_s] = value
end if File.exists?(env_file)
end
# config.filter_parameter_logging << :oldpassword, :password
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
......
......@@ -29,9 +29,24 @@ Rails.application.configure do
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# config.active_job.queue_adapter = :async
# config.action_mailer.default_options = { from: 'support@venjob.com' }
config.action_mailer.default_options = { from: ENV['GMAIL_USERNAME'] }
config.action_mailer.default_url_options = { host: "localhost:3000" }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "localhost:3000",
user_name: ENV['GMAIL_USERNAME'],
password: ENV['GMAIL_PASSWORD'],
authentication: "plain",
enable_starttls_auto: true
}
config.action_mailer.perform_caching = false
......
# Settings.add_source!("#{Rails.root}/config/environments/development.yml")
# Settings.reload!
Config.setup do |config|
# Name of the constant exposing loaded settings
config.const_name = 'Settings'
# Ability to remove elements of the array set in earlier loaded settings file. For example value: '--'.
#
# config.knockout_prefix = nil
# Overwrite an existing value when merging a `nil` value.
# When set to `false`, the existing value is retained after merge.
#
# config.merge_nil_values = true
# Overwrite arrays found in previously loaded settings file. When set to `false`, arrays will be merged.
#
# config.overwrite_arrays = true
# Load environment variables from the `ENV` object and override any settings defined in files.
#
config.use_env = true
# Define ENV variable prefix deciding which variables to load into config.
#
# Reading variables from ENV is case-sensitive. If you define lowercase value below, ensure your ENV variables are
# prefixed in the same way.
#
# When not set it defaults to `config.const_name`.
#
config.env_prefix = 'SETTINGS'
# What string to use as level separator for settings loaded from ENV variables. Default value of '.' works well
# with Heroku, but you might want to change it for example for '__' to easy override settings from command line, where
# using dots in variable names might not be allowed (eg. Bash).
#
# config.env_separator = '.'
# Ability to process variables names:
# * nil - no change
# * :downcase - convert to lower case
#
# config.env_converter = :downcase
# Parse numeric values as integers instead of strings.
#
# config.env_parse_values = true
# Validate presence and type of specific config values. Check https://github.com/dry-rb/dry-validation for details.
#
# config.schema do
# required(:name).filled
# required(:age).maybe(:int?)
# required(:email).filled(format?: EMAIL_REGEX)
# end
end
......@@ -8,6 +8,18 @@ Rails.application.routes.draw do
get '/login', to: 'sessions#new', as: :login
delete '/logout', to: 'sessions#destroy', as: :logout
get '/register/1', to: 'confirmations#new', as: :register_step1
post '/register/2', to: 'confirmations#mail_register', as: :register_step2
get '/forgot_password', to: 'reset_passwords#reset_password', as: :reset_password_step1
post '/forgot_password', to: 'reset_passwords#sending_email', as: :reset_password_step2
get '/reset_password', to: 'reset_passwords#edit', as: :reset_password_final
patch '/update', to: 'reset_passwords#update', as: :update_forgot_pass
get '/registation/3', to: 'users#registation', as: :registation
resources :jobs
get 'detail/:id', to: 'jobs#show', as: :job_detail
......@@ -15,9 +27,12 @@ Rails.application.routes.draw do
get 'jobs/industry/:converted_name', to: 'jobs#industry_jobs', as: :industry_jobs
get 'jobs/company/:converted_name', to: 'jobs#company_jobs', as: :company_jobs
resources :top_pages
resources :industries
resources :cities
resources :reset_passwords, only: [:edit, :update]
resources :confirmations, only: [:new]
resources :top_pages, only: [:index]
resources :industries, only: [:index]
resources :cities, only: [:index]
root to: "top_pages#index"
end
general_notify:
update_success: 'Updated Successfully'
user:
expiration: 'Link Confirmation is expiration too 24 hours to confirm. Please update your Email again!'
password_mismatch: 'Password is mismatch'
warning_signin: 'Please Sign In...'
reset_password:
failed: 'Your Email invalid or not register'
success: 'Please check your email to change your password'
update_reset_pass: 'Password or Password Confirmation is mismatch'
sign_in:
failed: 'Invalid email or password'
sign_up:
existed: 'Email existed. Please change !!!'
format_failed: 'Email formated invalid'
class CreateJobs < ActiveRecord::Migration[5.2]
def change
create_table :jobs, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :jobs, options: 'COLLATE=utf8_general_ci' do |t|
t.string :title
t.text :description
t.string :level
......
class CreateCities < ActiveRecord::Migration[5.2]
def change
create_table :cities, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :cities, options: 'COLLATE=utf8_general_ci' do |t|
t.string :name
t.boolean :location
t.string :converted_name
......
class CreateCityJobs < ActiveRecord::Migration[5.2]
def change
create_table :city_jobs, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :city_jobs, options: 'COLLATE=utf8_general_ci' do |t|
t.timestamps
end
end
......
class CreateIndustries < ActiveRecord::Migration[5.2]
def change
create_table :industries, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :industries, options: 'COLLATE=utf8_general_ci' do |t|
t.string :name
t.string :converted_name
......
class CreateIndustryJobs < ActiveRecord::Migration[5.2]
def change
create_table :industry_jobs, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :industry_jobs, options: 'COLLATE=utf8_general_ci' do |t|
t.timestamps
end
......
class CreateCompanies < ActiveRecord::Migration[5.2]
def change
create_table :companies, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :companies, options: 'COLLATE=utf8_general_ci' do |t|
t.string :name
t.text :address
t.text :introduction
......
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :users, options: 'COLLATE=utf8_general_ci' do |t|
t.string :name
t.string :email
t.string :password_digest
......
class CreateJobApplieds < ActiveRecord::Migration[5.2]
def change
create_table :job_applieds, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :job_applieds, options: 'COLLATE=utf8_general_ci' do |t|
t.string :name
t.string :email
t.text :cv_user
t.timestamps
end
end
......
class CreateHistories < ActiveRecord::Migration[5.2]
def change
create_table :histories, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :histories, options: 'COLLATE=utf8_general_ci' do |t|
t.timestamps
end
......
class CreateFavoriteJobs < ActiveRecord::Migration[5.2]
def change
create_table :favorite_jobs, :options => 'COLLATE=utf8_general_ci' do |t|
create_table :favorite_jobs, options: 'COLLATE=utf8_general_ci' do |t|
t.timestamps
end
......
class CreateConfirmation < ActiveRecord::Migration[5.2]
def change
create_table :confirmations, options: 'COLLATE=utf8_general_ci' do |t|
t.string :email
t.string :confirm_token
t.timestamps
end
end
end
......@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_07_15_035356) do
ActiveRecord::Schema.define(version: 2020_08_19_053159) do
create_table "cities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "name"
......@@ -36,6 +36,13 @@ ActiveRecord::Schema.define(version: 2020_07_15_035356) do
t.datetime "updated_at", null: false
end
create_table "confirmations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "email"
t.string "confirm_token"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "favorite_jobs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment