Ruby on rails 如何在Rails中进行异常验证

Ruby on rails 如何在Rails中进行异常验证,ruby-on-rails,ruby,ruby-on-rails-3,validation,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Validation,Ruby On Rails 4,我是rails的新手,我被这个问题困扰着:我有一个名为User的模型 class User < ActiveRecord::Base attr_accessor :password EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i validates :first_name, :presence => true,:format => /\A[a-zA-Z]+\z/ validates :last_

我是rails的新手,我被这个问题困扰着:我有一个名为User的模型

class User < ActiveRecord::Base
  attr_accessor :password
  EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
  validates :first_name, :presence => true,:format => /\A[a-zA-Z]+\z/
  validates :last_name, :presence => true,:format => /\A[a-zA-Z]+\z/
  validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
  validates :password, :presence => true
  validates_length_of :password, :in => 6..20, :on => :create
end
class用户true,:format=>/\A[A-zA-Z]+\Z/
验证:last_name,:presence=>true,:format=>/\A[A-zA-Z]+\Z/
验证:email,:presence=>true,:university=>true,:format=>email\u REGEX

验证:password,:presence=>true 验证以下内容的长度:password,:in=>6..20,:on=>:create 终止
使用数据库属性
名字
姓氏
电子邮件
哈希密码
加密密码

当我创建用户的新对象并将其保存在数据库中时,没有问题。现在,我想编辑我的用户对象的属性,除了电子邮件和密码

一旦我试图通过编辑rails资源来编辑记录,它就会标记一个错误,即密码不应为空。如果用户想要编辑他/她的信息,我计划豁免验证,但我知道这不是一个好做法

希望找到最佳答案。

对于初学者,请检查-一旦此方法变为unDRY(重复超过2-3次),请参阅

一旦您变得更高级,您将希望尝试表单/服务类中的一些内容,并在那里提取特定于表单/操作的验证-

…欢迎使用rails:)

尝试使用

validates :password, :presence => true, on: :create
在用户编辑表单中,添加除电子邮件和密码之外的所有字段


但问题是,当您要更改密码时,并没有对密码进行验证。因此,当您实施“更改密码”部分时,您需要对其进行处理,并且nee需要手动为密码添加错误。

问题已解决!我不确定这是否是最好的解决方案。一旦我实例化了一个用户对象,我就使用after_初始化,然后将updatePassword设置为true作为默认值,然后在用户对象的编辑操作中,我将updatePassword设置为false,以便在验证中免除它。我还对updatePassword使用条件验证:D谢谢你所有的想法

模型设计是错误的。我建议你检查一下Sabyasachi Ghosh的书,设计的哪一部分是错误的?我假设这是一对一的关系。您应该使用诸如password和confirm password之类的字段,然后生成password部分。否则,您需要提供on:create选项each place.validates:password,:presence=>true,on::create我关心的是,当我尝试对电子邮件和密码进行编辑操作时,我的密码字段将不会被验证,因为它只会在创建时被验证。我说得对吗@Bachan Smruty?谢谢你的主意。这就是我在编辑后的答案中分享的内容。首先,您不应该将电子邮件添加到编辑页面,因为它对于每个用户都是唯一的。密码是,您需要手动处理。