Ruby on rails 基于新模型的Rails下拉菜单

Ruby on rails 基于新模型的Rails下拉菜单,ruby-on-rails,drop-down-menu,html-select,Ruby On Rails,Drop Down Menu,Html Select,几天来,我一直在努力解决这个问题,但什么都做不到。我一直在基于Michael Hartl的精彩教程构建我的第一个应用程序:。此外,我也尝试过这样做,但我的代码和他的代码之间的差异太大,我无法理解 我的应用程序与Michael Hurtl的不同之处在于,我正在尝试创建一个网站,在那里你可以发布剩余的油漆罐(而不是microposts,又名twitter)。当我创建这个应用程序时,我在绘画模型中有一个名为“color_family”的专栏。现在我想把它从一个文本字段改为一个带有预定值的下拉列表,例如

几天来,我一直在努力解决这个问题,但什么都做不到。我一直在基于Michael Hartl的精彩教程构建我的第一个应用程序:。此外,我也尝试过这样做,但我的代码和他的代码之间的差异太大,我无法理解

我的应用程序与Michael Hurtl的不同之处在于,我正在尝试创建一个网站,在那里你可以发布剩余的油漆罐(而不是microposts,又名twitter)。当我创建这个应用程序时,我在绘画模型中有一个名为“color_family”的专栏。现在我想把它从一个文本字段改为一个带有预定值的下拉列表,例如“红色”、“橙色”、“黄色”、“绿色”等等

我首先生成了一个新的脚手架:

rails generate scaffold Color_Family family:string
然后我生成了一个迁移:

rails generate migration AddColor_FamilyToPaints family_id:int
然后全部迁移了

然后我创建了关联

class ColorFamily < ActiveRecord::Base
    has_many :paints
end
class ColorFamily

class Paint
这是我迷路的地方,任何我试图遵循的教程都会破坏一切。在哪里定义预先确定的颜色族列表

对我来说,创造一个新模型值得吗?我以前在表单字段中尝试过:

<%= form_for(@paint) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
    <%= f.label :color_family %>
    <%= select_tag(:color_family, options_for_select([['Red', 1],
                                                        ['Orange', 2], 
                                                        ['Yellow', 3], 
                                                        ['Green', 4], 
                                                        ['Blue', 5], 
                                                        ['Purple', 6], 
                                                        ['Black', 7], 
                                                        ['Grey', 8], 
                                                        ['White', 9], 
                                                        ['Cream', 10],
                                                        ['Brown', 12]])) %> 

虽然它为我创建了一个下拉列表,但在我添加新颜料时,它从未捕获信息


非常感谢您的帮助。另外,一个指向教程的链接可能会给我最大的帮助,因为我对RoR和后端的东西基本上都很陌生。

我不确定你是在阅读这本书还是在看视频。我个人都推荐!绝对惊人的教程!他首先提到的一个问题是,“脚手架不是真正的现实世界”,你应该考虑这个问题。当我在做项目时,无论是新的还是旧的,或者只是重构,我通常都会用脚本/generate手工添加所有内容。我唯一使用过的“脚手架”是脚手架控制器,因为我太懒了,不能用手来做控制器

简而言之,您应该有另一个模型“颜色”,并且表格应该:

f.collection_select(:color_id, Color.find(:all), :id, :name, {:include_blank => 'Please Select A Color'})
颜色族应该是一个有很多颜色的族

如果你能给我一个应该发生的细节,我可以为你写一个小数据模型


编辑#1

你需要一个“有一个”:通过关系。总体概念将是

枢轴选项卡:

油漆等级:

class Paint:颜色族
#允许在表单中嵌套颜色族。
接受:颜色\u族的\u嵌套属性\u,:允许\u销毁=>true
结束
你会注意到一些变化。除了attr\u accessible和accepts\u nested\u attributes\u for(您可能需要它,但不确定是否有)。构建表单时,请查看选择框的ID/名称。如果以_属性结尾,则使用accepts行。如果没有,你就不需要了。更改:color\u families\u属性以匹配选择框的名称

表格HTML:


'请选择颜色系列'})%>

您的表单有很多错误。你应该在它前面有一个表单,用于do | f |,添加f.select|u标记和f.submit|u标记,或者你只是把它从帖子中删除了吗?@KyleC是的,我没有包括整个表单。我已经更新了我的问题。谢谢Thx的信息和提供帮助!因为我是新来的,所以当你说“应该进行详细的关联”时,我不确定你在要求什么。但我可以试着回答。如果你走了,你可以“有点”看到我想做什么。如果您试图找到一些颜料,主页上会显示与您要查找的颜色族对应的按钮。因此,一种颜料有一个颜色系列,一个名称和(希望)一个十六进制。颜色族的目标是帮助优化用户的搜索。这有意义吗?
f.collection_select(:color_id, Color.find(:all), :id, :name, {:include_blank => 'Please Select A Color'})
rails g migration ColorFamilyPaints paint_id:integer color_family_id:integer
class Paint < ActiveRecord::Base
    attr_accessible :family_id, :name, :hex, :location, :quantity, :additional_info,
                    :color_families_attributes # Need to add this in order for you to be able to post with drop down
    belongs_to :user
    ...
    # Creates the Relationship
    has_one :color_families, :through => :color_family_paints

    # Allows color families to be nested in the form.
    accepts_nested_attributes_for :color_families, :allow_destroy => true
end
<%= form_for(@paint) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <div class="field">
        <%= f.label :color_family %>
        <%= f.collection_select(:color_family, ColorFamily.find(:all), :id, :name, {:include_blank => 'Please Select Color Family'}) %>
    </div>
<% end %>