# Representa los distintos tipos de campos que pueden venir de una # plantilla compleja class Post class TemplateField attr_reader :post, :contents, :key def initialize(post, key, contents) @post = post @key = key @contents = contents end def type return @type if @type return unless simple? case when contents == 'string' @type = 'text' when contents == 'text' @type = 'text_area' when contents.is_a?(String) && contents.split('/', 2).count == 2 @type = 'select' when contents.is_a?(Array) @type = 'select' when contents.is_a?(FalseClass) || contents.is_a?(TrueClass) @type = 'check_box' end @type end # Si la plantilla es simple no está admitiendo Hashes como valores def simple? !complex? end def complex? contents.is_a? Hash end # XXX Retrocompatibilidad def to_s key end def to_param if array? { key.to_sym => [] } else key.to_sym end end def array? @contents.is_a? Array end # TODO detectar cuando es complejo y tomar el valor de :multiple def multiple? array? end def value @contents end # Obtiene los valores posibles para el campo de la plantilla def values return '' if %w[string text].include? value # Para obtener los valores posibles, hay que procesar la string y # convertirla a parametros # # XXX Prestar atención a no enviar metodos privados # Si es una array de un solo elemento, es un indicador de que # tenemos que rellenarla con los valores que indica if value.is_a?(Array) && value.count == 1 values = value.first else values = value end # Procesar el valor if values.is_a?(String) value = values.split(':', 2).map do |v| collection, attr = v.split('/', 2) if collection == 'site' # TODO puede ser peligroso permitir acceder a cualquier # atributo de site? No estamos trayendo nada fuera de # lo normal post.site.send(attr.to_sym) else post.site.everything_of(attr, lang: collection) end end value = value.last.zip value.first end # En última instancia, traer el valor por defecto value end end end