【问题标题】:Is possible to use Rails ActiveModel::Validations per instance?每个实例可以使用 Rails ActiveModel::Validations 吗?
【发布时间】:2011-12-10 02:28:06
【问题描述】:

有一段我的代码:

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 } } )

有办法吗?

【问题讨论】:

  • 上面的代码有问题吗?理论上,这应该有效
  • 是的,如果我在实例 A 上添加数字验证,在实例 B 上添加长度验证,A 和 B 将执行相同的验证,以上两个
  • 无需深入研究,您可能想尝试 instance_eval 而不是 class_eval:更多:jimmycuadra.com/posts/…
  • 与 Configuracao::Key.instance_eval 相同......如果我更改为 self.instance_eval 我得到'未定义的方法'
  • @talski 你可以发布你的答案并接受它,这是回答你自己问题的首选方式。

标签: ruby-on-rails validation configuration


【解决方案1】:

我找到了一个解决方案,也许不是那么优雅或最好的方法,但它确实有效

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

现在每次我实例化一个 Key 时,该类将只针对该实例进行修改

【讨论】:

    【解决方案2】:

    这行得通吗?

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

    如果没有,您应该可以使用custom validator 进行更多控制。

    【讨论】:

    • 我找不到使用它的解决方案,all_hash_validations_pass 方法中每个验证的样本如何?
    • 不管是你创建验证哈希(这取决于你,我不知道你打算怎么做),将它传递给那个方法。
    • 我想,为了让它在范围内,你需要以某种方式使散列全局化,或者至少在类级别可见。
    猜你喜欢
    • 2014-03-20
    • 2020-02-12
    • 2016-10-02
    • 2012-12-13
    • 1970-01-01
    • 2013-12-11
    • 2011-03-09
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多