Create ID10, ID11, ID13

parent 9cd7e3ff
Pipeline #891 canceled with stages
in 0 seconds
...@@ -16,6 +16,7 @@ gem 'uglifier', '>= 1.3.0' ...@@ -16,6 +16,7 @@ gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes # See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby # gem 'mini_racer', platforms: :ruby
gem 'bcrypt-ruby', '3.1.2' gem 'bcrypt-ruby', '3.1.2'
gem 'carrierwave', '2.1.0'
# Use CoffeeScript for .coffee assets and views # Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2' gem 'coffee-rails', '~> 4.2'
gem 'mechanize', '~> 2.7.6' gem 'mechanize', '~> 2.7.6'
......
...@@ -62,6 +62,13 @@ GEM ...@@ -62,6 +62,13 @@ GEM
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
regexp_parser (~> 1.5) regexp_parser (~> 1.5)
xpath (~> 3.2) xpath (~> 3.2)
carrierwave (2.1.0)
activemodel (>= 5.0.0)
activesupport (>= 5.0.0)
addressable (~> 2.6)
image_processing (~> 1.1)
mimemagic (>= 0.3.0)
mini_mime (>= 0.1.3)
childprocess (3.0.0) childprocess (3.0.0)
chromedriver-helper (2.1.1) chromedriver-helper (2.1.1)
archive-zip (~> 0.10) archive-zip (~> 0.10)
...@@ -89,6 +96,9 @@ GEM ...@@ -89,6 +96,9 @@ GEM
domain_name (~> 0.5) domain_name (~> 0.5)
i18n (1.8.3) i18n (1.8.3)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
image_processing (1.11.0)
mini_magick (>= 4.9.5, < 5)
ruby-vips (>= 2.0.17, < 3)
io-like (0.3.1) io-like (0.3.1)
jbuilder (2.10.0) jbuilder (2.10.0)
activesupport (>= 5.0.0) activesupport (>= 5.0.0)
...@@ -117,6 +127,7 @@ GEM ...@@ -117,6 +127,7 @@ GEM
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2020.0512) mime-types-data (3.2020.0512)
mimemagic (0.3.5) mimemagic (0.3.5)
mini_magick (4.10.1)
mini_mime (1.0.2) mini_mime (1.0.2)
mini_portile2 (2.4.0) mini_portile2 (2.4.0)
minitest (5.14.1) minitest (5.14.1)
...@@ -183,6 +194,8 @@ GEM ...@@ -183,6 +194,8 @@ GEM
rubocop-ast (0.2.0) rubocop-ast (0.2.0)
parser (>= 2.7.0.1) parser (>= 2.7.0.1)
ruby-progressbar (1.10.1) ruby-progressbar (1.10.1)
ruby-vips (2.0.17)
ffi (~> 1.9)
ruby_dep (1.5.0) ruby_dep (1.5.0)
rubyzip (2.3.0) rubyzip (2.3.0)
sass (3.7.4) sass (3.7.4)
...@@ -247,6 +260,7 @@ DEPENDENCIES ...@@ -247,6 +260,7 @@ DEPENDENCIES
bootsnap (>= 1.1.0) bootsnap (>= 1.1.0)
byebug byebug
capybara (>= 2.15) capybara (>= 2.15)
carrierwave (= 2.1.0)
chromedriver-helper chromedriver-helper
coffee-rails (~> 4.2) coffee-rails (~> 4.2)
jbuilder (~> 2.5) jbuilder (~> 2.5)
......
...@@ -2,7 +2,22 @@ ...@@ -2,7 +2,22 @@
// They will automatically be included in application.css. // They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/ // You can use Sass (SCSS) here: http://sass-lang.com/
.email-field, .password-field, .forgot-pass-field, .login-btn, .regis-btn { .email-field, .password-field, .name-field, .forgot-pass-field, .cv-field, .new-password-field, .old-password-field {
margin: 20px; margin: 20px;
padding: 10px; padding: 10px;
} }
.input-email, .input-name, .input-cv, .input-new-password, .input-old-password {
width: 300px;
}
.login-btn, .regis-btn, .update-btn, .my-jobs-btn {
margin: 20px;
padding: 10px;
}
.login-label, .my-page-label {
margin: 30px;
padding: 20px;
}
#error_explanation ul li{
color: red;
}
class SessionsController < ApplicationController class SessionsController < ApplicationController
def new def new
redirect_to my_page_path if signed_in?
end end
def create def create
user = User.find_by(email: params[:session][:email].downcase) user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password]) if user && user.authenticate(params[:session][:password])
sign_in user sign_in user
redirect_to user redirect_to my_page_path
else else
flash.now[:danger] = 'Invalid email or password' flash.now[:danger] = 'Invalid email or password'
render 'new' render 'new'
......
class UsersController < ApplicationController class UsersController < ApplicationController
def index before_action :signed_in_user, only: [:update, :my_page, :my_info]
def my_page
@user = User.find(current_user.id)
end end
def show def my_info
@user = User.find(params[:id]) @user = User.find(current_user.id)
end
def update
@user = User.find(current_user.id)
if BCrypt::Password.new(@user.password_digest) != change_password[:oldpassword]
flash.now[:danger] = 'Old Password is mismatch'
else
if @user.update_attributes(user_params)
flash[:success] = 'Updated Successfully'
redirect_to my_page_path
else
respond_to do |format|
format.js
end
end
end
end
private
def signed_in_user
unless signed_in?
flash[:warning] = "Please Sign In..."
redirect_to login_path
end
end
def user_params
params.require(:user).permit(:name, :email, :cv_user, :password)
end
def change_password
params.require(:user).permit(:oldpassword)
end end
end end
class User < ApplicationRecord class User < ApplicationRecord
before_save { self.email = email.downcase } before_save { self.email = email.downcase }
before_create :create_remember_token before_create :create_remember_token
mount_uploader :cv_user, UserCvUploader
has_many :favorite_jobs has_many :favorite_jobs
has_many :jobs, through: :favorite_jobs has_many :jobs, through: :favorite_jobs
...@@ -16,8 +18,8 @@ class User < ApplicationRecord ...@@ -16,8 +18,8 @@ class User < ApplicationRecord
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false } uniqueness: { case_sensitive: false }
validates :password, length: { minimum: 6 } validates :password, length: { minimum: 6, too_short: "is blank or too short" }
validates :password_confirmation, presence: true
def User.new_remember_token def User.new_remember_token
SecureRandom.urlsafe_base64 SecureRandom.urlsafe_base64
......
class UserCvUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def size_range
0..5.megabytes
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url(*args)
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process scale: [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process resize_to_fit: [50, 50]
# end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
# def extension_whitelist
# %w(jpg jpeg gif png)
# end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
<div class="flash rounded">
<% flash.each do |key, value| %>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
</div>
...@@ -5,11 +5,12 @@ ...@@ -5,11 +5,12 @@
<nav> <nav>
<ul class="navbar-nav mr-auto"> <ul class="navbar-nav mr-auto">
<% if signed_in? %> <% if signed_in? %>
<li><%= link_to "My Page", my_page_path , class: "nav-item nav-link" %></li>
<li><%= link_to "Log Out", logout_path , class: "nav-item nav-link", method: "delete" %></li> <li><%= link_to "Log Out", logout_path , class: "nav-item nav-link", method: "delete" %></li>
<% else %> <% else %>
<li><%= link_to "Log In", login_path , class: "nav-item nav-link" %></li> <li><%= link_to "Log In", login_path , class: "nav-item nav-link" %></li>
<% end %>
<li><%= link_to "Register", '#', class: "nav-item nav-link" %></li> <li><%= link_to "Register", '#', class: "nav-item nav-link" %></li>
<% end %>
<li><%= link_to "Favorite", '#', class: "nav-item nav-link" %></li> <li><%= link_to "Favorite", '#', class: "nav-item nav-link" %></li>
<li><%= link_to "History", '#', class: "nav-item nav-link" %></li> <li><%= link_to "History", '#', class: "nav-item nav-link" %></li>
</ul> </ul>
......
<% provide(:title, "Sign In") %> <% provide(:title, "Sign In") %>
<div class="container"> <div class="container">
<div class="flash-login rounded"> <%= render 'layouts/flash' %>
<% flash.each do |key, value| %> <h1 class="text-center login-label">Login</h1>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
</div>
<h1 class="text-center">Login</h1>
<div class="form-login"> <div class="form-login">
<div class="row form d-flex justify-content-center"> <div class="row form d-flex justify-content-center">
<%= form_for(:session, url: sessions_path) do |f| %> <%= form_for(:session, url: sessions_path) do |f| %>
<div class="email-field"> <div class="email-field">
<div class="col-4-sm"> <div class="col-4-sm">
<%= f.label :email %>: <%= f.label :email %>
</div> </div>
<div class="col-8-sm"> <div class="col-8-sm">
<%= f.text_field :email %> <%= f.text_field :email %>
...@@ -19,7 +15,7 @@ ...@@ -19,7 +15,7 @@
</div> </div>
<div class="password-field"> <div class="password-field">
<div class="col-4-sm"> <div class="col-4-sm">
<%= f.label :password %>: <%= f.label :password %>
</div> </div>
<div class="col-8-sm"> <div class="col-8-sm">
<%= f.password_field :password %> <%= f.password_field :password %>
...@@ -29,7 +25,7 @@ ...@@ -29,7 +25,7 @@
<%= link_to 'Forgot password?', '#' %> <%= link_to 'Forgot password?', '#' %>
</div> </div>
<%= f.submit "Login", class: 'btn btn-outline-primary btn-lg login-btn' %> <%= 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', '#', class: 'btn btn-outline-info btn-lg regis-btn' %>
<% end %> <% end %>
</div> </div>
......
<%= render 'layouts/flash' %>
<% if @user.errors.any? %>
<div id="error_explanation">
<div class="alert alert-danger">
The form contains <%= pluralize(@user.errors.count, "error") %>.
</div>
<ul>
<% @user.errors.full_messages.each do |value| %>
<li><%= value %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="container">
<h1 class="text-center my-page-label">My Page</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' %>
</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="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>
<div class="new-password-field">
<div class="col-4-sm">
<%= f.label :password, 'New Password' %>
</div>
<div class="col-8-sm">
<%= f.password_field :password, class: 'input-new-password' %>
</div>
</div>
<div class="old-password-field">
<div class="col-4-sm">
<%= f.label :oldpassword, 'Old Password' %>
</div>
<div class="col-8-sm">
<%= f.password_field :oldpassword, class: 'input-old-password' %>
</div>
</div>
<%= f.submit 'Update', class: 'btn btn-outline-primary btn-lg update-btn' %>
<% end %>
</div>
</div>
</div>
<div class="container">
<%= render 'layouts/flash' %>
<h1 class="text-center my-page-label">My Page</h1>
<div class="form-login">
<div class="row form d-flex justify-content-center">
<%= form_for(@user) do |f| %>
<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' %>
</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="cv-field">
<div class="col-4-sm">
<%= f.label :cv_user, 'My CV' %>:
</div>
<div class="col-8-sm">
<%= link_to @user.cv_user.identifier, @user.cv_user.url, download: @user.cv_user.identifier %>
</div>
</div>
<%= link_to 'Update', my_page_info_path, class: 'btn btn-outline-primary btn-lg update-btn' %>
<%= link_to 'My Jobs', '#', class: 'btn btn-outline-info btn-lg my-jobs-btn' %>
<% end %>
</div>
</div>
</div>
<div class="container">
<%= @user.name %>
</div>
$(".validation").html("<%=escape_javascript render(:partial => 'shared/error_messages') %>");
...@@ -3,6 +3,8 @@ Rails.application.routes.draw do ...@@ -3,6 +3,8 @@ Rails.application.routes.draw do
resources :users resources :users
resources :sessions, only: [:new, :create, :destroy] resources :sessions, only: [:new, :create, :destroy]
match '/my', to: 'users#my_page', via: 'get', as: :my_page
match '/my/info', to: 'users#my_info', via: 'get', as: :my_page_info
match '/login', to: 'sessions#new', via: 'get', as: :login match '/login', to: 'sessions#new', via: 'get', as: :login
match '/logout', to: 'sessions#destroy', via: 'delete', as: :logout match '/logout', to: 'sessions#destroy', via: 'delete', as: :logout
......
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