【问题标题】:ActiveRecord custom validation problemActiveRecord 自定义验证问题
【发布时间】:2009-11-26 12:46:17
【问题描述】:

我的 RoR 模型中的验证存在问题:

默认保存 self.accessed = Time.now.to_s self.modified = 访问 验证用户名 极好的 结尾 def validate_username if User.find(:first, :select => :id, :conditions => ["userid = '#{self.userid}'"]) self.errors.add(:userid, "已经存在") 结尾 结尾

如您所见,我已经用自己的方法替换了模型的保存方法,在调用父级 .save 方法之前调用了 validate_username。我的问题是,即使添加了错误,Rails 仍会尝试将新行插入数据库,即使用户名重复。我在这里做错了什么?

PS:我没有使用validate_uniqueness_of,因为以下区分大小写的问题:https://rails.lighthouseapp.com/projects/8994/tickets/2503-validates_uniqueness_of-is-horribly-inefficient-in-mysql

更新:我尝试了 weppos 解决方案,它可以工作,但不是我想要的那样。现在,该字段被标记为不正确,但前提是所有其他字段都正确。我的意思是,如果我输入了错误的电子邮件地址,例如,电子邮件字段被标记为错误,而用户 ID 字段则不是。然后,当我提交正确的电子邮件地址时,用户 ID 字段被标记为不正确。希望你们明白我的意思:D

更新 2:数据应该以某种方式进行验证,不应该将重复的用户 ID 插入数据库,不区分大小写。用户 ID 的格式为“用户域”,例如。 “test-something.net”。不幸的是,validates_uniqueness_of :userid 不起作用,它尝试将“test-something.net”插入数据库,即使已经存在“Test-something.net”。 validate_username 应该是我解决这个问题的(快速)解决方法,但它没有用。 weppos 解决方案确实有效,但并不如我所愿(如我的第一次更新中所述)。

还没有弄清楚……有人吗?

最好的问候, x3ro

【问题讨论】:

  • 您能否详细说明应如何验证数据?

标签: ruby-on-rails validation activerecord


【解决方案1】:

为什么不使用回调并保持保存方法不变? 另外,避免直接 SQL 值插值。

class ... < ActiveRecord::Base

  before_save :set_defaults
  before_create :validate_username

  protected

  def set_defaults
    self.accessed = Time.now.to_s
    self.modified = accessed
  end

  def validate_username
    errors.add(:userid, "already exists") if User.exists?(:userid => self.userid)
    errors.empty?
  end

end

【讨论】:

  • before_create 而不是 before_save。否则 validate_username 将在所有保存时失败。否则很好的答案。
【解决方案2】:

只有在 validate_username 返回 true 或类似的情况下才调用 super 怎么样?

默认保存 self.accessed = Time.now.to_s self.modified = 访问 超级如果 validate_username 结尾 def validate_username if User.find(:first, :select => :id, :conditions => ["userid = '#{self.userid}'"]) self.errors.add(:userid, "已经存在") 返回假 结尾 结尾

...我认为您也可以完全删除 super 调用。不确定,但你可以测试一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多