Помните, что я не работает должным образом.
Как я хочу, чтобы это работало -> во время входа в систему, если пользователь проверяет флажок запомнить меня, приложение должно запомнить его, в противном случае оно не должно помнить пользователя,
но в настоящее время, даже если пользователь не устанавливает флажок запомнить меня, он запоминает его.
Контроллер приложения:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
helper_method :current_user, :logged_in?, :logged_in_user, :current_user?, :forget
before_action :set_cache_buster
def log_in(user)
session[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
end
end
def logged_in?
!current_user.nil?
end
def logged_in_user
unless logged_in?
flash[:danger] = 'Please log in.'
redirect_to new_sessions_path
end
end
def current_user?(user)
user == current_user
end
private
def set_cache_buster
response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
response.headers['Pragma'] = 'no-cache'
response.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT'
end
end
Контроллер сеанса
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
if params[:remember_me] == 1
log_in user
token = SecureRandom.urlsafe_base64
user.auth_token = token
cookies.permanent.signed[:auth_token] = token
redirect_to user
else
log_in user
user.auth_token = nil
cookies[:auth_token] = nil
redirect_to user
end
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
@current_user = nil
cookies[:auth_token] = nil
reset_session
redirect_to root_path
end
end
Что я пробовал:
def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
if params[:remember_me] == 1
log_in user
token = SecureRandom.urlsafe_base64
user.auth_token = token
cookies.permanent.signed[:auth_token] = token
redirect_to user
else
# log_in user
user.auth_token = nil
cookies[:auth_token] = nil
redirect_to user
end
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
Я прокомментировал строку login user в приведенном выше коде. Что не позволяло пользователю войти в систему, флажок не отмечен. Это сработало. но потом ... я прокомментировал строку log_in, если часть кода ...
if params[:remember_me] == 1
# log_in user
token = SecureRandom.urlsafe_base64
user.auth_token = token
cookies.permanent.signed[:auth_token] = token
redirect_to user
else
Пользователь не должен был позволять входить в систему, если отмечен флажок, но он позволял входить пользователю.
По некоторым причинам, я думаю, что «если» в сессиях контроллер никогда не работает.
сеанс # новый - страница входа в систему -
<div class="row">
<div class="col-md-offset-3 col-md-7" style="text-align: center;">
<h2><b>Log In</b></h2>
</div>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-7">
<%= form_with url: sessions_path do |form| %>
<div class="form-group">
<%= form.label :email %>
<%= form.text_field :email, class: "form-control" %>
</div>
<div class="form-group">
<%= form.label :password %>
<%= form.text_field :password, class: "form-control" %>
</div>
<div class="field">
<%= form.label :"remember_me" %>
<%= form.check_box :remember_me %>
</div>
<%= form.submit "Login", class: "btn btn-primary btn-block" %>
<% end %>
</div>
</div>