2010-06-01 35 views
2

我对rails很新,我一直在构建一个CMS应用程序 后端。在窗体中组合两个模型在导轨上

一切进展顺利,但我想知道这是否可能?

基本上我有两个型号:

@page { id, name, number } 

@extended_page { id, page_id, description, image } 

的想法是,有一堆的网页,但并非所有网页都会 extended_content。如果有一个页面扩展了 内容,那么我希望能够有一个表格允许编辑 他们两个。

在控制器:

@page = Page.find(params[:id]) 
@extended= Extended.find(:first, :conditions => ["page_id = 
?",@page.id]) 
@combined = ... #merge the two somehow 

所以在观点:

<%- form_for @combined do |f| %> 

<%= f.label :name %> 
<%= f.text_field :name %> 

... 

<%= f.label :description %> 
<%= f.text_field :description %> 

<%- end > 

这样的控制器,也只有是一个模型,将 更新(这将更新到都)。

这可能吗?

回答

4

首先我不认为你需要第二个模型。如果存在扩展页面模型的所有(或任何)属性,则可以简单地为Page模型定义方法extended?,该模型返回true

你也可以想看看fields_for表格助手的方法。像这样的东西应该进入你的看法:

<%- form_for @combined do |f| %> 

<%= f.label :name %> 
<%= f.text_field :name %> 

<%- f.fields_for(:extended_page) do |ef| %> 

    <%= ef.label :image %> 
    <%= ef.file :image %> 
    <!-- other extended page form fields --> 

<%- end %> 

<!-- Other page form fields --> 
<%- end %> 
2

是的,这是。 '嵌套表单'和'fields_for'是你的答案。

<% form_for @combined do |form| %> 
    <% form.fields_for :page do |nested_form| %> 
    <%= nested_form.label :name %> 
    <%= nested_form.text_field :name %> 
    <% end %> 
    <% form.fields_for :extended_page do |nested_form| %> 
    <%= nested_form.label :desciption %> 
    <%= nested_form.text_field :description %> 
    <% end %> 
<% end %> 

的post数据会看起来像

{ "combined" => 
    "page" => {"name" => "the name"}, 
    "extended_page" => {"description" => "the description"} 
} 

,所以你应该能够像

page = Page.new(params[:combined][:page]) 
extended_page = ExtendedPage.new(params[:combined][:extended_page]) 
创建一个页面,扩展页的东西