Как создать проверки стиля activerecord вне activerecord? - PullRequest
1 голос
/ 22 апреля 2009

Я работаю над платформой для тестирования программного обеспечения, которое пишет моя компания. Наш продукт основан на веб-технологиях, и после выполнения запроса RESTful я хочу обработать результаты. Я хочу иметь возможность проверки типа activerecord в каждом классе команд, чтобы после его запуска результаты автоматически проверялись на соответствие всем «проверкам». Однако я не уверен, как это сделать. Мой код выглядит следующим образом (упрощенно, чтобы показать важные части).

class CodesecureCommand
  def execute
    result = RestClient.post("http://#{codesecure.host_name_port}#{path}", post_data)

    return parse(result) #parse simple returns a Hpricot document
  end
end

class RunScan < CodesecureCommand

  #What I have now
  #I have to override the execute function so that it calls the local success method
  #to see if it failed or not.
  def execute()
    result = super()

    if success(result)
      return true
    else
    end

  end

  def success(result)
    result.search('div.transaction-message') do |message|
      if message.innerHTML.scan(/Configure abuse setting for domain users successfully\./).length == 1
        return true
      end
    end
  end



  #What I would like is to be able to call execute (without having to override it).
  #then after it runs it calls back to this class to check

  #if the regex matches the command was successful and returns true
  test_success /regex/

  #if test_success fails then these are called
  #the idea being that I can use the regex to identify errors that happened then
  #report them to the user
  identify_error /regex/, "message"
  identify_error /regex/, "message"
  end
end

Я хочу, чтобы после того, как метод execute вызывался, test_success и identif_error автоматически вызывались как проверки в activerecord. Кто-нибудь может сказать мне, как это сделать? Спасибо

Ответы [ 2 ]

3 голосов
/ 22 апреля 2009

Даже не взглянув на ваш код, вот мое мнение о реализации методов класса валидации:

module Validations
  def self.included(base)
    base.extend ClassMethods
  end

  def validate
    errors.clear
    self.class.validations.each {|validation| validation.call(self) }
  end

  def valid?
    validate
    errors.blank?
  end

  def errors
    @errors ||= {}
  end

  module ClassMethods
    def validations
      @validations ||= []
    end

    def validates_presence_of(*attributes)
      validates_attributes(*attributes) do |instance, attribute, value, options|
        instance.errors[attribute] = "cant't be blank" if value.blank?
      end
    end

    def validates_format_of(*attributes)
      validates_attributes(*attributes) do |instance, attribute, value, options|
        instance.errors[attribute] = "is invalid" unless value =~ options[:with]
      end
    end

    def validates_attributes(*attributes, &proc)
      options = attributes.extract_options!

      validations << Proc.new { |instance|
        attributes.each {|attribute|
          proc.call(instance, attribute, instance.__send__(attribute), options)
        }
      }
    end
  end
end

Предполагается, что ActiveSupport существует, как и в среде Rails. Возможно, вы захотите расширить его, чтобы разрешить несколько ошибок для каждого атрибута, с instance.errors[attribute] << "the message", но я пропустил такие неясности, чтобы сделать этот короткий образец как можно более простым.

Вот краткий пример использования:

class MyClass
  include Validations

  attr_accessor :foo
  validates_presence_of :foo
  validates_format_of :foo, :with => /^[a-z]+$/
end

a = MyClass.new
puts a.valid?
# => false

a.foo = "letters"
puts a.valid?
# => true

a.foo = "Oh crap$(!)*#"
puts a.valid?
# => false
2 голосов
/ 24 апреля 2009

Вы хотите Подтверждаемый : sudo gem install validatable

class Person
  include Validatable
  validates_presence_of :name
  attr_accessor :name
end

Кроме того, Validatable не зависит от ActiveSupport.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...