Rails 4.1通过hstore验证任意字段

16
我将使用HStore在Rails 4.1中管理I18n和语言存储。它很好用,唯一的问题是我想做类似于这样的事情(而不是使用store_accessor)。
在Rails 4.0中,这个方法很好用: https://gist.github.com/rf-/2322543 (simple_form and hstore basic functionality)
所以我可以简单地这样做:
  validates_hstore :content do
    validates_presence_of :en
  end

魔法发生的地方(在Rails 4.1中似乎无法正常工作)

module HstoreValidation
  def validates_hstore(field, &block)
    validation_class = Class.new do
      include ActiveModel::Validations

      def self.name
        '(validations)'
      end

      def initialize(data)
        @data = data
      end

      def read_attribute_for_validation(attr_name)
        @data[attr_name]
      end
    end
    validation_class.class_eval &block

    validate do
      validator = validation_class.new(self[field])

      if validator.invalid?
        validator.errors.each do |attr, text|
          self.errors.add(attr, text)
        end
      end
    end
  end
end

但是我总是得到,即使该字段不为空:

messages:
  :en:
  - can't be blank

1
旁注:当前验证的语法为:validates :en, presence: { presence: true, message: "自定义消息" }, - Andrey Deineko
请问您能否添加一下如何使用这个模块的说明? - parzival
1个回答

9

这是因为hstore键/值被转换为字符串,当验证尝试验证属性:en时,它总是会是nil,所以您可以替换您的read_attribute_for_validation方法:

def read_attribute_for_validation(attr_name)
  @data[attr_name.to_s]
end

注意:attr_name.to_s



也可以使用store_accessor,例如:

store_accessor :content, :en

validates :en, presence: true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接