1

私は単純な検証クラスを持っています:

class MappingValidator

    def validate(mapping)

    end

    protected

    def validate_presence_of_title(mapping)
      ...
    end

    def validate_presence_of_key(mapping)
      ...
    end

    def validates_class_exists(mapping)
      ...
    end

  end

メソッドでは、で始まる任意のメソッドを呼び出して、パラメーターとして渡しvalidateたいと思います。これはサブクラスでも機能する必要があるため、サブクラスがそれで始まるメソッドを宣言すると、サブクラスのインスタンスで validate が呼び出されたときにも呼び出されます。呼び出しの順序は関係ありません。validate_mappingMappingValidatorvalidate_

4

2 に答える 2

3

次のように単純にする必要があります。

methods.filter {|m| m.to_s.start_with? 'validate_'}.each {|m| send m, mapping}
于 2013-09-13T18:28:35.773 に答える
3

これはどのように ?

class MappingValidator

    def validate(mapping)
       self.methods.grep(/^validate_/).each do |m|
         send(m,mapping)
       end
    end

    protected

    def validate_presence_of_title(mapping)
      p "1"
    end

    def validate_presence_of_key(mapping)
      p "2"
    end

    def validates_class_exists(mapping)
      p "3"
    end

end

MappingValidator.new.validate("validate_")
# >> "1"
# >> "2"
于 2013-09-13T18:28:50.667 に答える