15

我在Rails 4.1中使用HStore來管理I18n和語言存儲。它的偉大工程我唯一的問題是我希望做這樣的事情(而不是使用store_accessor)rails 4.1通過hstore驗證任意字段

在Rails 4.0這個偉大的工作:

https://gist.github.com/rf-/2322543simple_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

旁註:爲validatons當前的語法:驗證:恩,存在:{存在:真,消息: 「自定義消息」}, – 2014-09-11 11:26:41

+0

燦你請添加這個模塊需要如何使用? – parzival 2017-01-05 18:36:49

回答

8

這是因爲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