15

Ich verwende HStore in Rails 4.1, um I18n und die Speicherung von Sprachen zu verwalten. Es funktioniert großartig das einzige Problem, das ich habe, ist ich, so etwas tun möchte (statt mit store_accessor)rails 4.1 Validierung von beliebigen Feldern über hstore

In Rails 4.0 ist dieser große gearbeitet:

https://gist.github.com/rf-/2322543 (simple_form and hstore basic functionality)

So konnte ich einfach so etwas wie:

validates_hstore :content do 
    validates_presence_of :en 
    end 

Wo die Magie passiert ist (scheint nicht richtig in Rails 4.1 zu arbeiten)

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 

Statt immer bekomme ich, auch wenn das Feld nicht leer ist:

messages: 
    :en: 
    - can't be blank 
+1

Bemerkung am Rande: aktuelle Syntax für validatons: validiert: en, Präsenz: {Präsenz: true, Meldung: "Custom Nachricht"}, –

+0

Can fügen Sie bitte hinzu, wie dieses Modul verwendet werden soll? – parzival

Antwort

8

kommt es, weil hstore Schlüssel/Werte werden in Strings umgewandelt, und wenn die Validierung Attribut zu validieren versucht :en es wird immer nil sein,

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

Anmerkung: so könnte man Ihre read_attribute_for_validation Methode ersetzen attr_name.to_s



auch Sie store_accessor wie verwenden:

store_accessor :content, :en 

validates :en, presence: true 
Verwandte Themen