Rails下拉菜单基于新模型

时间:2012-07-16 21:25:26

标签: ruby-on-rails drop-down-menu html-select

我一直试图解决这个问题几天,但无法开展任何工作。我一直在根据Michael Hartl的惊人教程http://ruby.railstutorial.org/构建我的第一个应用程序。另外,我尝试了这个tutorial,但我的代码和他的差异对我来说太过分了。

我的应用程序与迈克尔赫特尔的不同之处在于我正在尝试创建一个网站,您可以将您的左侧张贴在油漆罐上(而不是微博,AKA推特)。当我创建应用程序时,我在Paints模型中有一个名为“color_family”的列。现在我希望将其从文本字段更改为具有预定值的下拉列表,例如“Reds”,Oranges“,”Yellows“,Greens”等。

我开始生成一个新的脚手架:

rails generate scaffold Color_Family family:string

然后我生成了一个迁移:

rails generate migration AddColor_FamilyToPaints family_id:int

并将其全部迁移。

然后我创建了关联

class ColorFamily < ActiveRecord::Base
    has_many :paints
end

class Paint < ActiveRecord::Base
    attr_accessible :family_id, :name, :hex, :location, :quantity, :additional_info
    belongs_to :user
    belongs_to :color_family
    ...
end

这是我迷路的地方,我试图遵循的任何教程都会破坏一切。我在哪里定义我的预定color_families列表?

通过创建新模型对我来说是否值得?我以前在表单字段中尝试过这个:

<%= 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和后端的东西很新。

1 个答案:

答案 0 :(得分:2)

我不确定你是在阅读这本书或视频的阅读版本。就个人而言,我推荐两个!绝对惊人的教程!他提到的第一件事就是“脚手架不适合现实世界”,你应该考虑这个。当我正在进行项目,新旧或重构时,我通常会手动添加脚本/生成。我曾经使用的唯一“脚手架”是scaffold_controller,因为我懒得手工操作控制器。

简短的回答,你应该有另一个模型“颜色”,表格应该:

f.collection_select(:color_id, Color.find(:all), :id, :name, {:include_blank => 'Please Select A Color'})

ColorFamily可能应该是has_many_and_belongs_to_many颜色

如果你能告诉我一些应该发生的细节关联,我可以为你写一个小数据模式。


编辑#1

你需要一个has_one:through关系。一般概念将是......

Pivot tabel:

rails g migration ColorFamilyPaints paint_id:integer color_family_id:integer

Paint Class:

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

你会注意到一些变化。除了attr_accessible和accepts_nested_attributes_for(你可能需要这个,但不确定是否带有has_one)。构建表单时,请查看选择框的ID /名称。如果它以_attributes结尾,请使用accept行。如果没有,你不需要它。更改:color_families_attributes以匹配选择框的名称。

表单HTML:

<%= 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 %>

More information on associations @ RoR website.