Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何对已经有多个验证的ActiveModel属性进行条件验证?_Ruby On Rails_Ruby On Rails 3_Validation_Authlogic - Fatal编程技术网

Ruby on rails 如何对已经有多个验证的ActiveModel属性进行条件验证?

Ruby on rails 如何对已经有多个验证的ActiveModel属性进行条件验证?,ruby-on-rails,ruby-on-rails-3,validation,authlogic,Ruby On Rails,Ruby On Rails 3,Validation,Authlogic,我使用的是Authlogic,默认情况下,它会在登录、电子邮件和密码等字段上进行一些验证(长度、唯一性、格式等) 如果(比如)存在另一个属性,我希望能够跳过附加到其中一个属性的所有验证 这可能吗?比如: validate :email, :unless => :has_openid? 这将跳过格式、长度和唯一性验证(仅在电子邮件属性上) 我正在使用Rails 3.1.x应用程序和authlogic 3.1.0 更新:我试图关注这篇文章,但无法使其正常工作: 我使用authlogic完成此

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

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

这可能吗?比如:

validate :email, :unless => :has_openid?
这将跳过格式、长度和唯一性验证(仅在电子邮件属性上)

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

更新:我试图关注这篇文章,但无法使其正常工作:

我使用authlogic完成此操作的方法是将一个块传递给
acts as\u 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

我已经编写了一个变通方法,并将其抽象为一个gem:

档案:

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\u attr\u options方法并传入选项


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

true,我可以这样做,但它会将其与该属性上的特定验证集相耦合。例如,如果我在email字段中添加一个gem或任何其他验证,那么我也需要记住更新这个块…明白我的意思吗?这是公平的。当你说它“不起作用”时,你看到了什么行为?不管发生什么,它都在尝试验证字段吗?当我阅读文章时,保存失败了,但是没有错误消息,我发现这些消息非常奇怪……我没有深入研究它,后来我放弃了这种方法,所以我无法确切地告诉你到底发生了什么。我正在研究编写我自己的模块,该模块循环遍历所有User.validator和adds以及if/除非选项……但我发现rails源在初始化时冻结了选项散列。如果你想修改它,你可以尝试
dup
ing这个散列。当然,ruby的美妙之处在于你可以做任何你想做的事情,比如复制散列,然后执行实例变量集…但是“应该”我做这件事是个问题…我也可以使用猴子补丁ActiveModel::Validator…我希望有更好的方法。。。