我使用Rails堆栈
>设计
>监狱长
>确认
现在我对未经验证的用户的电子邮件确认和访问提供有一定的要求.假设有3类页面:
>案例1 – 不需要身份验证.
>案例2 – 需要身份验证,还需要确认用户.
>案例3 – 需要身份验证(正确的用户名和密码组合),但无需确认用户访问它们.
通过设计和确认,实施案例1和案例2是轻而易举的.用户登录/注册后,我会重定向到“确认您的电子邮件页面”.
我的问题是案例3.假设用户进行了登录/注册.他尚未确认他的电子邮件地址,但应该允许访问某些案例3的路线.当他访问案例3路线时,我希望:
>没有重定向
>有效会话
使用确认设计允许确认用户访问所有页面或不允许访问所有页面.它不允许访问具有身份验证但未经确认的某些页面.
我试过压倒设计确认了吗?通过实现这个逻辑:
class ApplicationController < ActionController::Base before_filter :verify_user def verify_user $flag = true if CERTAIN_ROUTES.include?(action_class) end end class User < ActiveRecord::Base def confirmed? $flag || !!confirmed_at end end
解决方法
而不是覆盖确认?你可以覆盖confirm_required吗?模型方法
(docs):
# user.rb class User < ActiveRecord::Base protected def confirmation_required? false end end
之后,您可以自己处理确认逻辑,通过在控制器需要确认时重定向before_action中的所有未确认用户,或者您可以将其拉入授权逻辑(例如,使用权威).
class ApplicationController < ActionController::Base def needs_confirmation redirect_to root_path unless current_user.confirmed? end end class SomeController < ApplicationController before_action :needs_confirmation end