【问题标题】:a simple rails 3.1 view using group_by使用 group_by 的简单 rails 3.1 视图
【发布时间】:2011-11-06 23:47:43
【问题描述】:

我正在处理的网站上有一个菜单,即 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

我的错误是我有一个 nil 对象。我想我对@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,而不是一个类别。
  • 非常感谢您的回复。我更改了一些代码,我明白你的意思。所以现在我得到一个:nil:NilClass 错误的未定义方法“类别”。所以也许我不明白这个论点,如何告诉group_by函数使用表中的类别字段?这不是 table.field 方式?

标签: ruby-on-rails view group-by


【解决方案1】:

你的视图代码充满了错误,应该是这样的:

= @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 没有在任何地方赋值。

【讨论】:

  • 这是有道理的,但我仍然得到一个 nil 错误。当你没想到时,你有一个 nil 对象!您可能期望有一个 Array 的实例。评估 nil.each gist.github.com/1344406 时发生错误
  • @Chad 您的视图名为index,但您的控制器操作方法名为food_list。这个控制器方法可能应该重命名为index
  • 另外,第一行应该以- 开头,而不是=。我写答案时错过了这个。
【解决方案2】:

您应该在模型上使用范围,而不是。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多