Избегайте создания идентичных страниц с прокси-сервером Middleman

Я создаю статический веб-сайт с помощью Middleman, ссылаясь на продукты, проанализированные из электронной таблицы.

В моей таблице есть следующие столбцы:

 _________________________________
| Product Name | Price | Category |
| Pet Food     |   $12 | Pets     |
| iPhone       |  $500 | Phone    |
| Pet toy      |   $25 | Pets     |
|______________|_______|__________|

Я создал страницы, на которых показаны все продукты в категориях Pets и Phone, используя шаблон под названием product_category.html. Он создает страницу для каждой уникальной категории, например. pets.html и phone.html.

Проблема в том, что, учитывая то, как я поступаю, Миддлман создает одну страницу категории для каждого продукта в категории, а затем пропускает ее, поскольку она идентична:

remote:           create     build/pets.html
remote:           identical  build/pets.html
remote:           create     build/iphone.html

Вот мой пример для config.rb:

rows_by_categories = app.data.spreadsheet.sheet1.group_by { |row| row.category }

#Category Landings

app.data.spreadsheet.sheet1.each do |f|
  proxy "/#{f.category.to_s.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')}.html", "/product_category.html", locals: {
    f: {
      categorytitle: f.category,
      name: f.name,
      all_in_category: rows_by_categories[f.category],
      price: f.selling_price,
    },
  categories: rows_by_categories.keys,
  }, ignore: true
end

Я понимаю, что цикл повторяется в каждой строке моей электронной таблицы и воссоздает страницу для соответствующей категории. Тем не менее, несколько попыток, которые я дал, например. изменение app.data.spreadsheet.sheet1.each do |f| в rows_by_categories.each do |f| не увенчалось успехом. Любая подсказка?

🤔 А знаете ли вы, что...
Ruby известен своей философией 'Принципов языка Ruby' (The Ruby Way), которая включает в себя простоту и элегантность.


93
1

Ответ:

Решено

Как уже упоминалось, у меня нет опыта работы с middleman, но я все равно попытаюсь помочь.

Похоже, ваша основная проблема заключается в том, что вы зацикливаете отдельные элементы, а не группы. Вместо этого попробуйте следующее.

rows_by_categories = app.data.spreadsheet.sheet1.group_by { |row| row.category }

#Category Landings
rows_by_categories.each do |category, rows|
    path_name = "/#{category.to_s.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')}.html" 
    row_data = rows.map do |row| 
        {
          categorytitle: row.category,
          name: row.name,
          price: row.selling_price,
        }
    end
    proxy path_name, "/product_category.html", locals: {
        products: row_data,
        categories: rows_by_categories.keys
     }, ignore: true
end

Здесь мы перебираем категории, и products теперь будет Array всех продуктов в этой категории, а не одного продукта. Это, насколько мне известно, создаст отдельную страницу для каждой категории и даст вам коллекцию products, которую вы можете просмотреть.