ruby-on-rails - 记住我的会员所有用户,即使他们不想被记住
问题描述
记住我工作不正常。
我希望它如何工作 -> 在登录时,如果用户选中记住我复选框应用程序应该记住它,否则它不需要记住用户。
但目前,即使用户没有选中记住我复选框,它也会记住它。
应用控制器:
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
我在上面的代码中注释了登录用户行。什么是不让用户登录复选框没有打勾。有效。但是然后...如果部分代码...我评论了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
如果勾选复选框,用户不应该让用户登录,但它确实让用户登录。
出于某种原因,我认为会话控制器中的“如果”永远不会起作用。
session#new -- 登录页面 --
<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>
解决方案
推荐阅读
- sql-server - 如果磁盘标签发生更改,如何重新配置 SQL Server 群集?
- redux - 我试图避免在 state reducer 中调用 dispatch,我不确定 redux-thunk 是否是我需要的解决方案
- c# - 对 Float 与 Double 基准测试感到困惑
- java - Ktor 创建一个额外的 Java 进程
- python - 我需要我的脚本运行几行直到任务完成
- c++ - "向量" 和有什么不一样
v(100)”和“向量 v[100]”? - php - 从安全的 SSL 路径调用和运行这个 php curl 函数的“正确方法”是什么?
- html - 我的 home 和 about 链接是否超链接到正确的页面?
- amazon-web-services - 用于 Lambda 的 VPC Rekognition 终端节点
- apache - 允许覆盖虚拟主机中的路径