# frozen_string_literal: true # Implementa valores por sí o por no # # Esto es increíblemente difícil de lograr que salga bien! class MetadataBoolean < MetadataTemplate def default_value false end # Los checkboxes son especiales porque la especificación de HTML # indica que no se envían aquellos checkboxes con valores vacíos, con # lo que nunca sabemos cuándo se los está deshabilitando. Rails # subsana esto enviando un valor vacío bajo el mismo nombre # (generalmente '0'). # # En este caso, queremos priorizar el dato enviado por le usuarie # antes que el generado internamente. # # Tenemos varios casos: # # * nil => false # * '0' => false # * '1' => true # * false # * true def value return document.data.fetch(name.to_s, default_value) if self[:value].nil? return self[:value] unless self[:value].is_a? String self[:value] = true_values.include? self[:value] end private # Los valores que evalúan a verdadero # # XXX: memoizamos porque Struct no puede declarar constantes. def true_values @true_values ||= %w[1 on true].freeze end end