2010-07-08 54 views
0

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

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

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

回答

2

如果您的照片属于画廊,那么是不是gallery_id在照片上?所以gallery_id将会是photo_form的成员,而不是gal_form

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

UPDATE:

这是我会怎么看你的看法:

<% 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 
+0

与我得到一个错误..未定义的方法'gallery_id' – 2010-07-08 17:25:01

+0

你可以显示添加您的数据库架构?因为如果照片将在一个图库中,那么您的模型显示正确。但是你的照片列表中应该有一个gallery_id列。另外,只是为了确认,你有'@photo = Photo.find(照片的ID)'? – 2010-07-08 17:33:08

+0

我没有galleries_id列,但我添加了一个,虽然它没有区别,并且照片的显示方法是正确的,@photo = Photo.find(params [:id]) – 2010-07-08 19:11:24

0

这听起来像你并不需要一个嵌套的表格。我会完全放弃accep_nested_attributes_。

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

您可以管理画廊单独的控制器/视图。

一旦你做到了这一点,并验证您的架构,上面的例子应该工作(集合中选择在画廊直接与照片)

+0

我不明白你的意思,我不应该有一个画廊模型? 工作流是正确的,照片是主要的,画廊是次要的,并非所有的照片将在画廊。 – 2010-07-08 19:13:34

+0

一张照片可能会也可能不在一个画廊里,只有一个画廊,对吧?所以你只需要在图片库上有一个collection_select。您可以管理其他地方画廊的创作/编辑。 – Winfield 2010-07-08 20:00:52

0

@Raphael:

列名应为gallery_id(在Ruby控制台型号名称+编号),将其添加

后试试这个下面一行

photos = Photo.find_all_by_gallery_id(Gallery.first) 

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

+0

这只是返回[],并且不应该返回任何内容,因为我没有向任何图库添加任何照片,因为那正是我想要工作的! – 2010-07-08 19:41:51

+0

如果它返回一个空数组,那么这应该工作 <%= photo_form.collection_select:gallery_id,Gallery.all,:id,:name%> – Vamsi 2010-07-08 19:43:43

+0

很高兴看到你的工作。 – Vamsi 2010-07-08 19:49:53