Google OAuth2验证时邮箱白名单配置后无法重定向至根路径问题
问题解决方法
你的核心问题出在save!方法上——这个方法在验证失败时会直接抛出异常,中断代码执行,导致控制器里的else分支根本没机会触发,自然没法重定向到根路径。
修复步骤
1. 修正模型中的from_omniauth方法
把模型里的admin.save!改成admin.save,这样验证不通过时会返回false,而不是抛出异常:
class Admin < ApplicationRecord # ... 其他代码保持不变 ... def self.from_omniauth(auth) admin = Admin.find_or_initialize_by(email: auth.info.email) admin.password = Devise.friendly_token.first(12) admin.skip_confirmation! admin.save # 替换原来的save! admin end # ... 其他代码保持不变 ... end
2. (可选)优化邮箱验证写法
可以把自定义的test_email验证换成Rails标准的格式验证写法,让代码更规范:
class Admin < ApplicationRecord # ... 其他代码保持不变 ... devise :omniauthable, omniauth_providers: [:google_oauth2] # 替换原来的validates :email, :test_email和private方法 validates_format_of :email, with: /\A[a-z.\-]+(\+\d+)?@test\.fr?\z/, message: 'Email is not correct' # ... 其他代码保持不变 ... end
修复后流程说明
当用户用不符合规则的邮箱登录时:
admin.save会返回false,不会抛出异常- 控制器中
@admin.persisted?会判断为false - 代码走到else分支,将错误信息存入flash,然后重定向到根路径
内容的提问来源于stack exchange,提问作者TheGame
相关产品推荐
相关产品推荐

