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']

¿Fue útil?

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;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top