代码之家  ›  专栏  ›  技术社区  ›  holden

rails 4.1通过hstore验证任意字段

  •  16
  • holden  · 技术社区  · 10 年前

    我使用Rails4.1中的HStore来管理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
    

    神奇的地方(在Rails4.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 回复  |  直到 7 年前
        1
  •  9
  •   Igor Guzak    10 年前

    发生这种情况是因为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