5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2025-02-17 00:51:49 +00:00

feat: poder asignar atributos sin guardar cambios

This commit is contained in:
f 2024-04-17 18:05:01 -03:00
parent 9fb3601d92
commit 42e9d5fd66
No known key found for this signature in database

View file

@ -15,6 +15,9 @@ class Post
PUBLIC_ATTRIBUTES = %i[lang date uuid created_at].freeze
ATTR_SUFFIXES = %w[? =].freeze
class PostError < StandardError; end
class UnknownAttributeError < PostError; end
attr_reader :attributes, :errors, :layout, :site, :document
# TODO: Modificar el historial de Git con callbacks en lugar de
@ -50,12 +53,33 @@ class Post
@errors = {}
@metadata = {}
# Inicializar valores
# Leer el documento si existe
# @todo Asignar todos los valores a self[:value] luego de leer
document&.read! unless new?
# Inicializar valores o modificar los que vengan del documento
assignable_attributes = args.slice(*attributes)
assign_attributes(assignable_attributes) if assignable_attributes.present?
end
# Asignar atributos, ignorando atributos que no se pueden modificar
# o inexistentes
#
# @param attrs [Hash]
def assign_attributes(attrs)
attrs = attrs.transform_keys(&:to_sym)
attributes.each do |attr|
public_send(attr)&.value = args[attr] if args.key?(attr)
self[attr].value = attrs[attr] if attrs.key?(attr) && self[attr].writable?
end
document.read! unless new?
unknown_attrs = attrs.keys.map(&:to_sym) - attributes
if unknown_attrs.present?
raise UnknownAttributeError, "Unknown attribute(s) #{unknown_attrs.map(&:to_s).join(', ')} for Post"
end
nil
end
def inspect
@ -165,8 +189,7 @@ class Post
# Limpiar el nombre del atributo, para que todos los ayudantes
# reciban el método en limpio
unless attribute? name
raise NoMethodError, I18n.t('exceptions.post.no_method',
method: name)
raise UnknownAttributeError, I18n.t('exceptions.post.no_method', method: name)
end
define_singleton_method(name) do
@ -386,11 +409,7 @@ class Post
end
def update_attributes(hashable)
hashable.to_hash.each do |attr, value|
next unless self[attr].writable?
self[attr].value = value
end
assign_attributes(hashable)
save
end