0

我正在使用 Authlogic,默认情况下会在登录、电子邮件和密码等字段上进行一些验证(长度、唯一性、格式等)。

如果存在另一个属性,我希望能够跳过附加到其中一个属性的所有验证。

这可能吗?就像是:

validate :email, :unless => :has_openid?

然后它将跳过电子邮件属性上的格式、长度和唯一性验证。

我正在使用 Rails 3.1.x 应用程序和 authlogic 3.1.0

更新:我试图关注这篇文章,但我无法让它正常工作: http ://erikonrails.snowedin.net/?p=242

4

2 回答 2

0

我编写了一个解决方法并将其抽象为一个 gem: https ://github.com/synth/conditional_attribute_validator

宝石文件:

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方法并传入选项。

我不太关心性能,因为这只是在初始化时执行的。

于 2012-07-02T23:52:55.473 回答
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
于 2012-06-29T22:25:03.513 回答