Можно ли использовать Rails ActiveModel :: Validations для каждого экземпляра? - PullRequest
2 голосов
/ 18 октября 2011

есть выдержка из моего кода:

module Configuracao
  extend self

  class Key
    include ActiveModel::Validations
    attr_accessor :name, :type, :default, :validations, :group, :available_values

    def initialize(params)
      params.symbolize_keys!.assert_valid_keys(:name, :type, :default, :validations, :group, :available_values)
      @group = params[:group]
      @name = params[:name]
      @type = params[:type]
      @available_values = params[:available_values]
      @default = params[:default]
      @validations = params[:validations]

      #in this way each validation is being added for all keys
      Configuracao::Key.class_eval do
        validates :value, params[:validations]
      end
    end
  end
end

поэтому для каждого ключа экземпляра у меня будет разная валидация, переданная в хэш

Key.new( validations: { presence: true, numericality: true } )
Key.new( validations: { length: { maximum: 30 } } )

Есть способ сделать это?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

ну, я нашел решение, может быть, не такой элегантный или лучший способ сделать это, но оно работает

def initialize(params)
  params.symbolize_keys!.assert_valid_keys(:name, :type, :default, :validations, :group, :available_values)
  @group = params[:group]
  @name = params[:name]
  @type = params[:type]
  @available_values = params[:available_values]
  @default = params[:default]
  @@current_validations = nil
  @@current_validations = @validations = params[:validations]

  class << self
    validates :value, @@current_validations unless @@current_validations.blank?
  end
end

теперь каждый раз, когда я создаю ключ , класс будет изменентолько для этого экземпляра

0 голосов
/ 18 октября 2011

Будет ли это работать?

...
validates :all_hash_validations_pass
...

def all_hash_validations_pass
  ...iterate through the hash here, and validate each of them
end

Если нет, вы можете использовать пользовательский валидатор для большего контроля.

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