fields_for嵌套表单

时间:2010-07-08 17:05:58

标签: ruby-on-rails forms

我有照片模型和画廊模型。画廊模型(我使用漂亮的脚手架)只有一个字段,一个画廊名称。 在我的照片编辑表单中,我想将每张照片链接到一个图库,例如。我创建了2个独立的画廊2009年和2010年,我希望每个照片编辑页面上都有一个下拉列表和画廊列表,因此每张照片都可以放在一个画廊中。 我一直在使用thisthis 作为起点,但我被卡住了,无法让我的照片形式出现。

 class Gallery < ActiveRecord::Base
  has_many :photos
  attr_accessible :name
 end

class Photo < ActiveRecord::Base
  belongs_to :gallery
  accepts_nested_attributes_for :gallery, :allow_destroy => true

视图/照片/ _form.html.erb

<% form_for @photo, :html => { :multipart => true } do |photo_form| %>

  <p>
    <%= photo_form.label :title %><br />
    <%= photo_form.text_field :title %>
  </p>

<p>
    <% photo_form.fields_for :gallery do |gal_form| %>

        <%= gal_form.label :name %> 
        <%= gal_form.collection_select :gallery_id, Gallery.all, :id, :name %>
  </p>

      <% end %>

  <p>
    <%= submit_tag %>
  </p>

<% end %>

目前在照片表单页面上没有下拉列表,但我没有收到任何错误,也没有在页面源中提及它。 我会感激任何帮助或指出正确的方向......

3 个答案:

答案 0 :(得分:2)

如果您的照片属于图库,则不是照片上的gallery_id?因此,gallery_id将是photo_form的成员,而不是gal_form的成员。

<%= photo_form.collection_select :gallery_id, Gallery.all, :id, :name %> 

更新:

以下是我将如何看待您的观点:

<% form_for @photo, :html => { :multipart => true } do |photo_form| %>

  <p>
    <%= photo_form.label :title %><br />
    <%= photo_form.text_field :title %><br />
    <%= photo_form.collection_select :gallery_id, Gallery.all, :id, :name %>
  </p>
  <p>
    <%= submit_tag %>
  </p>

<% end %>

你的模特:

class Gallery < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :gallery
end

答案 1 :(得分:0)

听起来你不需要嵌套表格。我会完全放弃accepts_nested_attributes_for。

工作流程应该是: 1)选择一个画廊 2)上传并描述照片

您可以使用单独的控制器/视图来管理图库。

一旦你完成了并验证了你的架构,上面的例子应该可以工作(集合选择直接绑在Photo上的画廊)

答案 2 :(得分:0)

@Raphael:

添加后,列名称应为 gallery_id (型号名称+ ID)

在ruby控制台中尝试以下行

photos = Photo.find_all_by_gallery_id(Gallery.first)

这应该会为您提供第一个图库中所有照片的列表。