我在Rails应用程序中使用权限进行身份验证。Clearance::User
mixin为我的User
模型添加了几个验证,但是有一个是我想要删除或覆盖的。做这件事最好的方法是什么?
所讨论的验证是
validates_uniqueness_of :email, :case_sensitive => false
这本身并不坏,但我需要添加:scope => :account_id
。问题是,如果我将它添加到我的User
模型中
validates_uniqueness_of :email, :scope => :account_id
我得到了两个验证,而且一次清关比我的更严格,所以我的没有任何效果。我要确保只有我的。我该怎么做?
发布于 2010-02-22 12:23:32
最后,我用以下黑客“解决”了这个问题:
:email
的:taken
属性的错误在您阅读代码并发现我如何删除错误之前,听起来是合理的。一旦添加了错误,ActiveRecord::Errors
就没有删除错误的方法,所以我必须掌握它的内部结构并亲自完成它。超级丑八怪。
这是代码:
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
如果有人知道更好的方法,我将非常感激。
发布于 2014-07-24 11:04:44
我会分叉GEM并添加一个简单的检查,然后可以重写它。我的例子使用了一个关注点。
关切:
module Slugify
extend ActiveSupport::Concern
included do
validates :slug, uniqueness: true, unless: :skip_uniqueness?
end
protected
def skip_uniqueness?
false
end
end
型号:
class Category < ActiveRecord::Base
include Slugify
belongs_to :section
validates :slug, uniqueness: { scope: :section_id }
protected
def skip_uniqueness?
true
end
end
发布于 2014-07-17 00:28:25
我需要删除狂乱的产品属性:value
验证,而且使用Klass.class_eval
和clear_validators!
of AciveRecord::Base
似乎有一个更简单的解决方案
module Spree
class ProductProperty < Spree::Base
#spree logic
validates :property, presence: true
validates :value, length: { maximum: 255 }
#spree logic
end
end
在这里推翻它
Spree::ProductProperty.class_eval do
clear_validators!
validates :property, presence: true
end
https://stackoverflow.com/questions/2309757
复制相似问题