如何在Devise登录表单空字段提交时显示对应验证错误
解决Devise登录表单空字段显示通用错误的问题
1. 生成自定义Sessions控制器
运行命令生成用户会话控制器:
rails generate devise:controllers users -c sessions
修改config/routes.rb,指定Devise使用自定义会话控制器:
devise_for :users, controllers: { sessions: 'users/sessions' }
2. 修改Sessions控制器添加字段验证
打开app/controllers/users/sessions_controller.rb,重写create方法,先验证字段非空,再执行原认证逻辑:
class Users::SessionsController < Devise::SessionsController def create self.resource = resource_class.new(sign_in_params) # 为空字段添加错误提示 resource.errors.add(:email, :blank) if sign_in_params[:email].blank? resource.errors.add(:password, :blank) if sign_in_params[:password].blank? if resource.errors.present? clean_up_passwords(resource) set_minimum_password_length respond_with(resource, location: new_session_path(resource_name)) return end # 执行Devise默认认证逻辑 super end end
3. 在登录视图中添加字段级错误显示
修改登录视图(app/views/devise/sessions/new.html.erb),在每个字段下方添加对应错误提示:
<h2>登录</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name), data: { turbo: false }) do |f| %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> <%# 显示email字段错误 %> <% if resource.errors[:email].any? %> <span class="error"><%= resource.errors[:email].first %></span> <% end %> </div> <div class="field"> <%= f.label :password %><br /> <%= f.password_field :password, autocomplete: "current-password" %> <%# 显示password字段错误 %> <% if resource.errors[:password].any? %> <span class="error"><%= resource.errors[:password].first %></span> <% end %> </div> <% if devise_mapping.rememberable? %> <div class="field remember"> <%= f.check_box :remember_me %> <%= f.label :remember_me %> </div> <% end %> <div class="actions"> <%= f.submit "登录" %> </div> <% end %> <%= render "devise/shared/links" %>
4. 可选:配置中文错误提示
创建或修改config/locales/devise.zh-CN.yml,设置中文错误文本:
zh-CN: errors: messages: blank: "不能为空" devise: sessions: invalid: "邮箱或密码无效" # 字段非空但认证失败时显示通用提示
完成以上步骤后,当登录表单的邮箱或密码为空时,会在对应字段下方显示“不能为空”的提示,而非原有的通用错误。
内容的提问来源于stack exchange,提问作者Alphy Gacheru
相关产品推荐
相关产品推荐

