usar structs para validar datos

los structs son como hashes con llaves fijas.  si llamamos a una que no
existe vamos a tener una excepción
This commit is contained in:
f 2020-02-13 12:38:53 -03:00
parent 8a9197c390
commit 57b652bbb1
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
3 changed files with 17 additions and 7 deletions

View file

@ -169,10 +169,16 @@ class Site < ApplicationRecord
# @param lang: [String|Symbol] traer los artículos de este idioma
def posts(lang: nil)
read
@posts ||= {}
lang ||= I18n.locale
return @posts[lang] if @posts.key? lang
# Traemos los posts del idioma actual por defecto
lang ||= I18n.locale
# Crea un Struct dinámico con los valores de los locales, si
# llegamos a pasar un idioma que no existe vamos a tener una
# excepción NoMethodError
@posts ||= Struct.new(*locales.map(&:to_sym)).new
return @posts[lang] unless @posts[lang].blank?
@posts[lang] = PostRelation.new site: self
@ -201,11 +207,15 @@ class Site < ApplicationRecord
#
# @return { post: Layout }
def layouts
@layouts ||= data.fetch('layouts', {}).map do |name, metadata|
# Crea un Struct dinámico cuyas llaves son los nombres de todos los
# layouts. Si pasamos un layout que no existe, obtenemos un
# NoMethodError
@layouts_struct ||= Struct.new(*data.fetch('layouts', {}).keys.map(&:to_sym), keyword_init: true)
@layouts ||= @layouts_struct.new(**data.fetch('layouts', {}).map do |name, metadata|
{ name.to_sym => Layout.new(site: self,
name: name.to_sym,
metadata: metadata.with_indifferent_access) }
end.inject(:merge)
end.inject(:merge))
end
# Trae todos los valores disponibles para un campo

View file

@ -105,7 +105,7 @@ class Site
# Encuentra todos los layouts con campos estáticos
def layouts
@layouts ||= site.layouts.reject do |_, layout|
@layouts ||= site.layouts.to_h.reject do |_, layout|
layout.metadata.select do |_, desc|
STATIC_TYPES.include? desc['type']
end.empty?

View file

@ -13,7 +13,7 @@
%h3= t('posts.new')
%ul
- @site.layouts.keys.each do |layout|
- @site.layouts.to_h.keys.each do |layout|
%li= link_to layout.to_s.humanize,
new_site_post_path(@site, layout: layout)