【发布时间】:2013-12-02 09:27:37
【问题描述】:
我目前正在尝试实现我的第一个重要的 Rails 应用程序,但在尝试实现 Devise 时遇到了一些问题。最初,我使用的是 Hartl Rails 教程中描述的手动验证方法。在退出(或者我相信)所有手动代码之后,我添加了 Devise gem,以及一些自定义字段,所有这些在幕后都可以正常工作,这意味着我可以注册、登录和以其他方式使用应用程序。
然而,我现在遇到的问题是,我错过了验证中的一个技巧,因为一旦我导航到用户注册视图,表单就会呈现完整的大、丑陋、红色的错误消息,如下所示:
Email can't be blank
Password can't be blank
First name can't be blank
Last name can't be blank
请记住,这些错误消息是在渲染时立即生成的,甚至在用户有机会输入数据之前。
我可以通过注释掉user.rb 中的验证来消除名字和姓氏错误。如果我去掉 Devise 可验证模块,我可以防止出现电子邮件和密码错误。
这里是 user.rb:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :entry
has_many :categories
has_many :rates
has_many :entries
# If I comment out the next four lines regarding validation, error messages disappear
validates :first_name, presence: true
validates :first_name, uniqueness: true, if: -> { self.first_name.present? }
validates :last_name, presence: true
validates :last_name, uniqueness: true, if: -> { self.last_name.present? }
def full_name
fullname = "#{last_name}, #{first_name}"
end
end
在用户实际提交数据之前,我如何才能让这些错误消息不显示,以及在提交数据时,我如何验证每个字段(因为我目前的非解决方案只是为了完全避免验证)?提前致谢。
【问题讨论】:
-
您是否在没有手动定义验证的情况下进行了测试? Devise 提供了自己的验证,我将首先对其进行测试 :)
-
通过一项一项地做这两件事来测试,一次从这个模型中删除
:validatable,第二次删除你自己的验证,但继续工作:validatable -
正如我在原帖中提到的(我知道,它很长):如果我注释掉我的自定义字段(first_name,last_name)的验证,错误消息不会显示,但我没有验证。如果我删除了 :validatable 模块,我唯一的保护就是电子邮件字段是 f.email_field,并且允许使用空白密码。你可以理解为什么这是不可接受的。
-
@Rich Peck:出于好奇,我使用包含这些自定义字段的自定义视图 (config.scoped views = true) 创建了一个带有自定义 first_name 和 last_name 字段的 Devise 准系统实现,并且我没有错误消息。显然,有些不同,但 application_controller.rb 是相同的,并且工作版本上的用户模型仅包含设计模块信息。也许我会削减原始副本中的 user.rb,看看会发生什么。
-
嗯。 Devise有一个脾气暴躁的习惯!如果您尝试其他方法,请告诉我们:)
标签: ruby-on-rails ruby validation devise