mirror of
https://0xacab.org/sutty/sutty
synced 2025-02-20 01:11:48 +00:00
feat: poder asignar atributos sin guardar cambios
This commit is contained in:
parent
9fb3601d92
commit
42e9d5fd66
1 changed files with 29 additions and 10 deletions
|
@ -15,6 +15,9 @@ class Post
|
||||||
PUBLIC_ATTRIBUTES = %i[lang date uuid created_at].freeze
|
PUBLIC_ATTRIBUTES = %i[lang date uuid created_at].freeze
|
||||||
ATTR_SUFFIXES = %w[? =].freeze
|
ATTR_SUFFIXES = %w[? =].freeze
|
||||||
|
|
||||||
|
class PostError < StandardError; end
|
||||||
|
class UnknownAttributeError < PostError; end
|
||||||
|
|
||||||
attr_reader :attributes, :errors, :layout, :site, :document
|
attr_reader :attributes, :errors, :layout, :site, :document
|
||||||
|
|
||||||
# TODO: Modificar el historial de Git con callbacks en lugar de
|
# TODO: Modificar el historial de Git con callbacks en lugar de
|
||||||
|
@ -50,12 +53,33 @@ class Post
|
||||||
@errors = {}
|
@errors = {}
|
||||||
@metadata = {}
|
@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|
|
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
|
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
|
end
|
||||||
|
|
||||||
def inspect
|
def inspect
|
||||||
|
@ -165,8 +189,7 @@ class Post
|
||||||
# Limpiar el nombre del atributo, para que todos los ayudantes
|
# Limpiar el nombre del atributo, para que todos los ayudantes
|
||||||
# reciban el método en limpio
|
# reciban el método en limpio
|
||||||
unless attribute? name
|
unless attribute? name
|
||||||
raise NoMethodError, I18n.t('exceptions.post.no_method',
|
raise UnknownAttributeError, I18n.t('exceptions.post.no_method', method: name)
|
||||||
method: name)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
define_singleton_method(name) do
|
define_singleton_method(name) do
|
||||||
|
@ -386,11 +409,7 @@ class Post
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_attributes(hashable)
|
def update_attributes(hashable)
|
||||||
hashable.to_hash.each do |attr, value|
|
assign_attributes(hashable)
|
||||||
next unless self[attr].writable?
|
|
||||||
|
|
||||||
self[attr].value = value
|
|
||||||
end
|
|
||||||
|
|
||||||
save
|
save
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue