lib/hobo_fields/enum_string.rb in hobofields-0.9.0 vs lib/hobo_fields/enum_string.rb in hobofields-0.9.100
- old
+ new
@@ -17,40 +17,81 @@
class << self
def with_values(*values)
@values = values.*.to_s
+ @translated_values = Hash.new do |hash, value|
+ if name.blank? || value.blank?
+ hash[value] = value
+ else
+ hash[value] = I18n.t("#{name.tableize}.#{value}", :default => value)
+ @detranslated_values[hash[value]] = value
+ hash[value]
+ end
+ end
+
+ @detranslated_values = Hash.new do |hash, value|
+ if name.blank?
+ hash[value] = value
+ else
+ hash[value] = @values.detect(proc { value } ) {|v|
+ @translated_values[v]==value
+ }
+ end
+ end
end
attr_accessor :values
+ attr_accessor :translated_values
+
+ attr_accessor :detranslated_values
+
def for(*values)
+ options = values.extract_options!
values = values.*.to_s
c = Class.new(EnumString) do
values.each do |v|
const_name = v.upcase.gsub(/[^a-z0-9_]/i, '_').gsub(/_+/, '_')
- const_name = "V" + const_name if const_name =~ /^[0-9_]/
+ const_name = "V" + const_name if const_name =~ /^[0-9_]/ || const_name.blank?
const_set(const_name, self.new(v)) unless const_defined?(const_name)
method_name = "is_#{v.underscore}?"
define_method(method_name) { self == v } unless self.respond_to?(method_name)
end
end
c.with_values(*values)
+ c.set_name(options[:name]) if options[:name]
c
end
def inspect
name.blank? ? "#<EnumString #{(values || []) * ' '}>" : name
end
alias_method :to_s, :inspect
+ def set_name(name)
+ @name = name
+ end
+
+ def name
+ @name || super
+ end
+
end
COLUMN_TYPE = :string
+ def initialize(value)
+ super(self.class.detranslated_values.nil? ? value : self.class.detranslated_values[value.to_s])
+ end
+
def validate
- "must be one of #{self.class.values * ', '}" unless self.in?(self.class.values)
+ "must be one of #{self.class.values.map{|v| v.blank? ? '\'\'' : v} * ', '}" unless self.in?(self.class.values)
+ end
+
+ def to_html(xmldoctype = true)
+ self.class.translated_values[self]
end
def ==(other)
if other.is_a?(Symbol)
super(other.to_s)