【问题标题】:How to have exception validation in Rails如何在 Rails 中进行异常验证
【发布时间】:2014-04-15 05:46:38
【问题描述】:

我是 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

具有数据库属性first_namelast_nameemailhashed_passwordencrypted_password

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

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

希望能找到最佳答案。

【问题讨论】:

  • 模型设计错误。推荐你看书ruby.railstutorial.org/ruby-on-rails-tutorial-book
  • @Sabyasachi Ghosh,设计的哪一部分是错误的?我认为这是一对一的关系..
  • 您应该使用密码和确认密码等字段,然后生成密码部分。否则,您需要在每个地方提供 on: create 选项。

标签: ruby-on-rails ruby ruby-on-rails-3 validation ruby-on-rails-4


【解决方案1】:

对于初学者,请查看 http://guides.rubyonrails.org/active_record_validations.html#conditional-validation - 一旦这种方法变得不干(重复超过 2-3 次),请参阅 http://apidock.com/rails/Object/with_options

一旦你变得更高级,你会想要在表单/服务类的行中尝试一些东西,并在那里提取特定于表单/操作的验证 - http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

...欢迎来到 Rails :)

【讨论】:

    【解决方案2】:

    尝试使用

    validates :password, :presence => true, on: :create
    

    并在用户编辑表单中添加除电子邮件和密码以外的所有字段。

    但问题是,当您要更改密码时,密码没有验证。所以当你实现 change_password 部分时,你需要处理它并且需要手动为密码添加错误。

    【讨论】:

    • validates :password, :presence => true, on: :create 我担心的是,当我尝试对电子邮件和密码进行编辑操作时,我的密码字段将不会被验证,因为它会被验证仅在创建时。我是对的@Bachan Smruty吗?谢谢你的想法。
    • 是的。这就是我在编辑的答案中分享的内容。首先,电子邮件您不应该将其添加到编辑页面,因为它对每个用户都是唯一的。是的密码,您需要手动处理。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多