我正在使用Authlogic,默认情况下会在登录,电子邮件和密码等字段上放置一些验证(长度,唯一性,格式等)。
如果存在另一个属性,我希望能够跳过附加到其中一个属性的所有验证。
这可能吗?类似的东西:
validate :email, :unless => :has_openid?
然后将跳过电子邮件属性上的格式,长度和唯一性验证。
我正在使用Rails 3.1.x应用程序和authlogic 3.1.0
更新:我试图关注这篇文章,但我无法让它正常工作: http://erikonrails.snowedin.net/?p=242
答案 0 :(得分:0)
我使用authlogic完成此操作的方法是将块传递给acts_as_authentic
:
acts_as_authentic do |config|
with_options :unless => :has_openid? do
config.merge_validates_format_of_email_field_options
config.merge_validates_length_of_email_field_options
config.merge_validates_uniqueness_of_email_field_options
end
end
答案 1 :(得分:0)
我写了一个解决方法并将其抽象为gem: https://github.com/synth/conditional_attribute_validator
Gemfile:
gem 'conditional_attribute_validator', :git => "git://github.com/synth/conditional_attribute_validator.git"
示例:
class User
include ConditionalAttributeValidator
validate_attributes_with_condition :login, :password, :password_confirmation, :unless => :has_another_form_of_authentication?
end
来源:
def validate_attributes_with_condition(*args)
opts = args.extract_options!
raise "Must have an :if or :unless option" unless opts.has_key?(:if) or opts.has_key?(:unless)
merge_methods = self.methods.grep(/merge_.*_options/)
args.each do |field|
merge_methods.grep(/#{Regexp.quote(field)}/).each do |m|
self.send(m, opts)
end
end
end
Rails基于已指定的任何验证自动创建merge_ attr _options方法,以便将选项合并到现有验证中。所以我查找这些方法并迭代它们并检查该方法是否适用于特定字段。如果是这样,我调用merge_ attr _options方法并传入选项。
我不太关心性能,因为这只是在初始化时执行。