如何验证带有错误消息的电子邮件
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 消息
向用户显示错误
[更新]我仍然不知道在我的创建控制器的其他地方放什么和错误消息。 我正在尝试验证用户电子邮件的格式。
这是 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 消息
向用户显示错误