# frozen_string_literal: true module MetadataBooleanConstants TRUE_VALUES = %w[1 on true].freeze end # Implementa valores por sí o por no # # Esto es increíblemente difícil de lograr que salga bien! class MetadataBoolean < MetadataTemplate include MetadataBooleanConstants include Metadata::NonIndexableConcern include Metadata::AlwaysPublicConcern # Devolver el valor desde el esquema y si no existe, por defecto es # false # # @return [Boolean] def default_value !!super 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 # # @todo Esto debería estar definido en sanitize o save def value case self[:value] when NilClass document.data.fetch(name.to_s, default_value) when String TRUE_VALUES.include? self[:value] else self[:value] end end # Siempre guardar el valor de este campo a menos que sea nulo # # @return [Boolean] def empty? value.nil? end end