如何验证带有错误消息的电子邮件

How to validate emails with error messages

[更新]我仍然不知道在我的创建控制器的其他地方放什么和错误消息。 我正在尝试验证用户电子邮件的格式。

这是 html 错误来自

 <% if @user.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@user.errors.count, "error") %> prohibited this article 
from being saved:</h2>

    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

我从一个旧的 ruby 视频中对此进行了试验,但没有看到效果。

这是我的user.rb模型

class User < ApplicationRecord
  has_secure_password
  validates :email, presence: true, uniqueness: true
  validates :password, length: { minimum: 4 }
  validates :email, format: { with: /(\A([a-z]*\s*)*\<*([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\>*\Z)/i }
end

我目前遇到这些错误

No route matches {:action=>"show", :controller=>"users", :id=>nil}, missing required keys: [:id]

undefined method `errors' for nil:NilClass

每当密码或电子邮件与要求不符时。

我在会话控制器中的创建操作:

class UsersController < ApplicationController
  def new 
    @user = User.new 
  end

  def create
    @user = User.create(password: params[:password], email: params[:email], firstname: params[:firstname], lastname: params[:lastname])
    if @user.save
      redirect_to user_path(@user)
    else
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end

  def show
    @user = User.find(params[:id])
  end
end

当没有用户使用请求的 email 地址时,您的 @user 变量在控制器中将是 nil(因为这是 find_by_email方法,如果没有找到)

在这种情况下,您正在显式呈现 new 视图,然后尝试在 @user 对象上呈现错误。但是,由于变量是 nil 而不是您显然期望的 User 对象,因此 nil.errors 失败并出现您在那里看到的错误。

要解决这个问题,您应该检查视图是否有实际的 @user 对象,或者从控制器渲染更合适的视图。

这里有 3 个问题

  def create
    @user = User.create(password: params[:password], email: params[:email], firstname: params[:firstname], lastname: params[:lastname])
    redirect_to user_path(@user)
  end

该函数尝试创建用户,无论是否成功,它都会继续重定向到显示操作

1) 您需要检查 User.create 是否确实成功,然后采取适当的措施

2) 您没有表演动作的路线,所以您需要解决这个问题,但是

3) None 的操作指定了格式。如果有人使用 XML 提要会怎样 您确定要向用户显示,只显示用户列表,不会有太多可看的东西

包括您在内的几个人要求提供您似乎忽略的完整堆栈跟踪。如果您这样做的话,这将更容易追踪错误的来源,包括发送到创建操作的参数

  def create
    if @user = User.create(password: params[:password], email: params[:email], firstname: params[:firstname], lastname: params[:lastname])
      redirect_to user_path(@user)
    else
      format.html { render :action => "new" }
    end
  end

现在你必须追查创建失败的原因 您还应该使用 flash 消息

向用户显示错误