1

这几天我一直在努力解决这个问题,但什么也做不了。我一直在根据 Michael Hartl 的精彩教程构建我的第一个应用程序:http ://ruby.railstutorial.org/ 。此外,我已经尝试过本教程,但我的代码和他的代码之间的差异对我来说太大了,无法遵循。

我的应用程序与 Michael Hurtl 的不同之处在于,我正在尝试创建一个网站,您可以在其中发布剩余的油漆罐(而不是微博,AKA twitter)。当我创建应用程序时,我在 Paints 模型中有一个名为“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 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 和后端的东西很陌生。

4

1 回答 1

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 关系。一般概念将是...

数据透视表:

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

你会注意到一些变化。除了 attr_accessible 和accepts_nested_attributes_for(你可能需要这个,但不确定是否有has_one)。构建表单时,请查看选择框的 ID/名称。如果它以 _attributes 结尾,请使用接受行。如果没有,你不需要它。更改 :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 %>

有关协会@ RoR 网站的更多信息。

于 2012-07-16T21:37:46.553 回答