Ruby on rails 基于新模型的Rails下拉菜单
几天来,我一直在努力解决这个问题,但什么都做不到。我一直在基于Michael Hartl的精彩教程构建我的第一个应用程序:。此外,我也尝试过这样做,但我的代码和他的代码之间的差异太大,我无法理解 我的应用程序与Michael Hurtl的不同之处在于,我正在尝试创建一个网站,在那里你可以发布剩余的油漆罐(而不是microposts,又名twitter)。当我创建这个应用程序时,我在绘画模型中有一个名为“color_family”的专栏。现在我想把它从一个文本字段改为一个带有预定值的下拉列表,例如“红色”、“橙色”、“黄色”、“绿色”等等 我首先生成了一个新的脚手架: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”的专栏。现在我想把它从一个文本字段改为一个带有预定值的下拉列表,例如
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 %>