首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除或重写由超类或混合体添加的ActiveRecord验证

删除或重写由超类或混合体添加的ActiveRecord验证
EN

Stack Overflow用户
提问于 2010-02-22 08:54:12
回答 9查看 19.9K关注 0票数 24

我在Rails应用程序中使用权限进行身份验证。Clearance::User mixin为我的User模型添加了几个验证,但是有一个是我想要删除或覆盖的。做这件事最好的方法是什么?

所讨论的验证是

代码语言:javascript
运行
复制
validates_uniqueness_of :email, :case_sensitive => false

这本身并不坏,但我需要添加:scope => :account_id。问题是,如果我将它添加到我的User模型中

代码语言:javascript
运行
复制
validates_uniqueness_of :email, :scope => :account_id

我得到了两个验证,而且一次清关比我的更严格,所以我的没有任何效果。我要确保只有我的。我该怎么做?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-02-22 12:23:32

最后,我用以下黑客“解决”了这个问题:

  1. 查找类型为:email:taken属性的错误
  2. 检查此帐户的电子邮件是否是唯一的(这是我想做的验证)
  3. 如果此帐户的电子邮件是唯一的,请删除此错误。

在您阅读代码并发现我如何删除错误之前,听起来是合理的。一旦添加了错误,ActiveRecord::Errors就没有删除错误的方法,所以我必须掌握它的内部结构并亲自完成它。超级丑八怪。

这是代码:

代码语言:javascript
运行
复制
def validate
  super
  remove_spurious_email_taken_error!(errors)
end

def remove_spurious_email_taken_error!(errors)
  errors.each_error do |attribute, error|
    if error.attribute == :email && error.type == :taken && email_unique_for_account?
      errors_hash = errors.instance_variable_get(:@errors)
      if Array == errors_hash[attribute] && errors_hash[attribute].size > 1
        errors_hash[attribute].delete_at(errors_hash[attribute].index(error))
      else
        errors_hash.delete(attribute)
      end
    end
  end
end

def email_unique_for_account?
  match = account.users.find_by_email(email)
  match.nil? or match == self
end

如果有人知道更好的方法,我将非常感激。

票数 6
EN

Stack Overflow用户

发布于 2014-07-24 11:04:44

我会分叉GEM并添加一个简单的检查,然后可以重写它。我的例子使用了一个关注点。

关切:

代码语言:javascript
运行
复制
module Slugify

  extend ActiveSupport::Concern

  included do

    validates :slug, uniqueness: true, unless: :skip_uniqueness?
  end

  protected

  def skip_uniqueness?
    false
  end

end

型号:

代码语言:javascript
运行
复制
class Category < ActiveRecord::Base
  include Slugify

  belongs_to :section

  validates :slug, uniqueness: { scope: :section_id }

  protected

  def skip_uniqueness?
    true
  end
end
票数 12
EN

Stack Overflow用户

发布于 2014-07-17 00:28:25

我需要删除狂乱的产品属性:value验证,而且使用Klass.class_evalclear_validators! of AciveRecord::Base似乎有一个更简单的解决方案

代码语言:javascript
运行
复制
module Spree
  class ProductProperty < Spree::Base

    #spree logic

    validates :property, presence: true
    validates :value, length: { maximum: 255 }

    #spree logic


  end
end

在这里推翻它

代码语言:javascript
运行
复制
Spree::ProductProperty.class_eval do    
  clear_validators!
  validates :property, presence: true
end
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2309757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档