простое представление рельсов 3.1 с использованием group_by - PullRequest
3 голосов
/ 07 ноября 2011

У меня есть меню на сайте, над которым я работаю, меню food_items. Каждая из записей в таблице также содержит поле категории. К этой категории могут относиться гамбургеры, закуски, напитки или все, что они хотят классифицировать по продуктам.

Я пытаюсь отобразить меню с элементами, сгруппированными по этому полю категории. Моя попытка пока:

food_item_menus_controller.rb
...
def food_list
  @foods = FoodItem.all
  @food_list = @foods.group_by { |t| t.category }
end


views/food_item_menus/index.html.haml
= @food_list.group_by (@food_items.category).each do |food_list|
  %p
    = food_list.name
  %ul
    -  for food_items in food_items
      %li
        = food_items.name

Моя ошибка в том, что у меня нулевой объект. Полагаю, мой звонок @foods ничего не возвращает.

models/food_item.rb
class FoodItem < ActiveRecord::Base
  has_many :menus, :through => :food_item_menus
  has_many :food_item_menus
end

Я что-то не так настроил? Или я ошибаюсь, что если я вызываю @foods в представлении, это на самом деле не вызывает переменную, установленную в контроллере? Чем больше я пытаюсь понять это, тем больше я запутываюсь во всем, включая основы.

Ответы [ 2 ]

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

Ваш код просмотра полон ошибок, он должен выглядеть примерно так:

= @food_list.each do |category, food_items|
  %p
    = category
  %ul
    - food_items.each do |food|
      %li
        = food.name

Разбивка ошибок:

  • @food_list.group_by(@food_items.category).each do |food_list| - вы не назначилизначение до @food_items где угодно;@food_list назначается как результат вызова group_by в вашем контроллере, поэтому здесь вы вызываете его дважды;group_by возвращает хеш, поэтому каждый ваш блок должен иметь два аргумента, а не один.
  • for food_items in food_items - использование одного и того же имени переменной для итерированной переменной и итератора;food_items нигде не назначено значение.
0 голосов
/ 07 ноября 2011

Вместо модели следует использовать область видимости.

class FoodItem
    scope :categorized, -> { group(:category) }
end

ссылки http://guides.rubyonrails.org/active_record_querying.html#group http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...