Pregunta
Soy principiante en Ruby y tengo problemas para entender este código.
require_relative 'custom_page'
module Jekyll
class Tag < CustomPage
def initialize(site, base, dir, tag)
super site, base, dir, 'tag'
self.data['tag'] = tag
self.data['title'] = "#{site.config['tag_title_prefix'] || 'Tag: '}#{tag}"
self.data['description'] = "#{site.config['tag_meta_description_prefix'] || 'Tag: '}#{tag}"
end
end
class Tags < CustomPage
def initialize(site, base, dir)
super site, base, dir, 'tags'
self.data['tags'] = site.categories.keys.sort
#1# puts self.data['tags']
end
end
class Site
# generate_tags_categories is called by the custom process function in site_process.rb
def generate_tags_categories
dir = self.config['tag_dir'] || 'tags'
write_page Tags.new(self, self.source, dir) if self.layouts.key? 'tags'
self.categories.keys.each do |tag|
puts "dd"
#2# puts tag
write_page Tag.new(self, self.source, File.join(dir, tag.slugize), tag)
end
end
end
end
En el código anterior, la declaración puts self.data['tags']
(marcado 1) genera más de 10 valores como se esperaba.Sin embargo, la línea puts tag
(marcado 2) genera solo un valor, lo que implica que la matriz contiene solo un valor.no es self.categories.keys.each
Se espera que recorra todos los valores que a su vez están asignados. self.data['tags']
Solución
Puede comenzar asegurándose de que las 'categorías' aún contener muchos valores antes de entrar en el bucle:
puts "categories.keys: #{self.categories.keys.inspect}" # <<- here
self.categories.keys.each do |tag|
puts "dd"
#2# puts tag
si el primero puts
muestra más de un valor y el bucle se llama solo una vez, es posible que desee investigar qué es lo que posiblemente hace que el bucle se rompa.Tal vez write_page
lanza una excepción, ¿capta en algún lugar la pila de llamadas?
Cuando depuras algunos valores, es mejor usar inspect
método en lugar de (llamado automáticamente por puts
) método to_s
.La salida de inspect
es más fácil de depurar.
Es posible (aunque poco probable) que la 'etiqueta' contenga algunos caracteres de control que borre la salida anterior, o algo así.El inspect
siempre es seguro. (vale, no siempre pero en la mayoría de los casos;)