【发布时间】:2016-01-19 04:58:57
【问题描述】:
我是 Rails 新手,我正在尝试为菜单项创建一个选择下拉菜单。复杂的部分是每个餐厅都有许多类别,其中包含许多菜单项。我的目标是有一个打印如下内容的下拉列表:
<optgroup label="Category 1">
<option value="menu_item 1">Menu Item 1</option>
<option value="menu_item 2">Menu Item 2</option>
<option value="menu_item 3">Menu Item 3</option>
</optgroup>
<optgroup label="Category 2">
<option value="menu_item 1">Menu Item 1</option>
<option value="menu_item 2">Menu Item 2</option>
<option value="menu_item 3">Menu Item 3</option>
<option value="menu_item 4">Menu Item 4</option>
</optgroup>
这是我的模型
class Category < ActiveRecord::Base
belongs_to :restaurant
has_many :menus, dependent: :destroy
end
class Restaurant < ActiveRecord::Base
has_many :meals, dependent: :destroy
accepts_nested_attributes_for :meals
has_many :categories, dependent: :destroy
end
class Menu < ActiveRecord::Base
belongs_to :category
end
在我添加到 Category 模型之前,我有以下内容来创建我的 Meal 对象:
<%= form_for [@customer,@meal] do |f| %>
<%=f.collection_select(:food_item,restaurant.menus.all, :name, :name) %>
<%= f.hidden_field :restaurant_id, value: restaurant.id %>
<%= f.submit "Submit meal"%>
<%end%>
我试图找出一种方法来做类似于 Grouped Select in Rails 的事情,但我不确定所涉及的额外模型到底如何。如果我需要包含任何其他信息,请告诉我,并提前感谢您的帮助!
【问题讨论】:
-
试试改成
<%=f.grouped_collection_select(:food_item, Category.all, restaurant.menus.all, :name, :id, :name) %> -
@Josh 看看railscasts.com/episodes/…
-
@Pavan 感谢您的快速回复!我认为您已经很接近了,但是菜单嵌套在每个类别中,而不是餐厅了。因此,它必须是 category.menus.all 之类的,而不是 restaurant.menus.all,但我不确定如何确保对 Category 的每个实例都这样做
-
好的。试试这个
<%=f.grouped_collection_select(:food_item, Category.all, Category.all.collect {|c| [ c.menus ] }, :name, :id, :name) %> -
@Pavan 这让我非常接近,但导致此错误
[#<ActiveRecord::Associations::CollectionProxy [#<Menu id: 36, name: "Mushroom Pizza", meal_type: nil, details: "Locally grown mushrooms", restaurant_id: 18, category_id: 5>]>]] is not a symbol nor a string我认为那是因为它是 c.menus 和 c.menus.name?
标签: ruby-on-rails ruby forms