Помощь в рубиновом коде - PullRequest
       19

Помощь в рубиновом коде

1 голос
/ 07 сентября 2011

Я новичок в Ruby и у меня проблемы с пониманием этого кода

    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

В приведенном выше коде оператор puts self.data['tags'] (помеченный 1) выводит более 10 значений, как и ожидалось. Однако строка puts tag (помеченная 2) выводит только одно значение, подразумевая, что массив содержит только одно значение. Не ожидается ли self.categories.keys.each зацикливания всех значений, которые присваиваются self.data['tags']

1 Ответ

2 голосов
/ 07 сентября 2011

Вы можете начать с проверки того, что «категории» все еще содержат много значений перед входом в цикл:

puts "categories.keys: #{self.categories.keys.inspect}" # <<- here
self.categories.keys.each do |tag|
  puts "dd"
  #2# puts tag

Если в первом puts указано более одного значения,и цикл вызывается только один раз, тогда вы можете захотеть выяснить, что может привести к разрыву цикла.Может быть, write_page выдает исключение, где-то перехватывает стек вызовов?

Когда вы отлаживаете некоторые значения, лучше использовать метод inspect вместо (автоматически вызываемого puts) метода to_s.Вывод inspect более удобен для отладки.

Возможно (хотя и маловероятно), что «тег» содержит некоторые управляющие символы, которые очищают предыдущий вывод, или что-то в этом роде.inspect всегда в безопасности. (хорошо, не всегда, но в большинстве случаев;)

...