2012-06-29 7 views
0

Я использую Authlogic, который по умолчанию ставит несколько валидаций (длина, уникальность, формат и т. Д.) В таких областях, как логин, адрес электронной почты и пароль.Как я могу поместить условную проверку на атрибут ActiveModel, который уже имеет несколько валидаций?

Я бы хотел пропустить все проверки, прикрепленные к одному из атрибутов, если, например, присутствует другой атрибут.

Возможно ли это? Что-то вроде:

validate :email, :unless => :has_openid? 

, который затем пропустит проверку формата, длины и уникальности только по атрибуту электронной почты.

Я работаю с 3.1.x приложение и authlogic Rails 3.1.0

Обновление: Я пытался следовать этой статьи, но я не мог заставить его работать правильно: http://erikonrails.snowedin.net/?p=242

ответ

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 
+0

true, я могу это сделать, но он связывает его с определенным набором валидаций по этому атрибуту. Например, что, если я добавлю драгоценный камень или добавлю какую-либо другую проверку в поле электронной почты ... Тогда мне нужно было бы также запомнить этот блок ... понимаете, что я имею в виду? –

+0

Это справедливо. Когда вы говорите, что это «не работает», какое поведение вы видите? Он пытается проверить область независимо от того, что? – x1a4

+0

, когда я следил за статьей, спад был неудачным, но не было сообщений об ошибках, которые я нашел очень странными ... Я не слишком глубоко в него заглядывал, и с тех пор я отказался от этого подхода, поэтому я не могу сказать вам точно, что происходило. Я занимался написанием своего собственного модуля, который перебирает все User.validators и добавляет, и если/если опция ..., но я обнаружил, что источник rails замораживает хэш-параметры параметров при инициализации [lib/active_model/validator.rb] (https: //github.com/rails/rails/blob/2e62af310d98fba78f338d916f7c17996446bc40/activemodel/lib/active_model/validator.rb) –

0

Я написал обходной путь и отведенной его в драгоценный камень: 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 автоматически создает _options методы, основанные на любых валидаций merge_ атр были указаны в порядке объединить варианты в существующую va lidation. Поэтому я просматриваю эти методы и перебираю их и проверяю, применяется ли этот метод к определенному полю. Если это так, я вызываю метод merge_ attr _options и передаю параметры.

Я не слишком беспокоюсь о производительности, поскольку это выполняется только при инициализации.