一个简单的Rails 3.1视图,使用group_by函数。

3
我正在处理一个网站上的菜单,其中包含食品项目的菜单。表中的每个记录还包含一个分类字段。此分类可以是汉堡包、小吃、饮料或任何其他他们想按食品项目分类的内容。
我试图显示菜单,并按此类别字段对项目进行分组。到目前为止,我的尝试如下:
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,它实际上没有调用我在控制器中设置的变量吗?我越想弄清楚这个问题,就越对一切感到困惑,包括基础知识。


只是提醒一下,你不是“调用” @foods,而是“引用”它。你可以调用方法。你可以使用 rails c(控制台)验证 FoodItem.all 是否返回了你期望的结果。@foods.each do |category| 很奇怪,因为每个对象实际上都是一个 FoodItem,而不是一个类别。 - Dave Newton
非常感谢您的回复。我已更改了一些代码,我明白您的意思。但现在我遇到一个“undefined method 'category' for nil:NilClass”错误。也许我还不理解参数,如何告诉group_by函数使用表中的category字段呢?难道不是table.field的方式吗? - Chad
2个回答

2

你的视图代码存在许多错误,应该像这样:

= @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 返回一个哈希表,所以你的 each 块应该有两个参数,而不是一个。
  • for food_items in food_items - 迭代变量和迭代器使用相同的变量名;food_items 没有被赋值过。

虽然看起来没问题,但我仍然遇到了空值错误。你可能期望得到一个数组实例,但却得到了一个空对象。这个错误出现在对空对象进行 each 操作时。https://gist.github.com/1344406 - Chad
@Chad,你的视图名为“index”,但是你的控制器动作方法名为“food_list”。这个控制器方法应该重命名为“index”。 - Tobias Cohen
另外,第一行应该以“-”开头,而不是“=”。当我写我的答案时,我错过了这个。 - Tobias Cohen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接