将Rails中的两个模型组合成一个表格

时间:2010-06-01 02:56:36

标签: ruby-on-rails ruby activerecord forms model

我对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 >

这种方式在控制器中,只需要有一个模型 更新(将更新为两者)。

这可能吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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 params看起来像

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

因此您应该可以通过

之类的内容创建页面和扩展页面
page = Page.new(params[:combined][:page])
extended_page = ExtendedPage.new(params[:combined][:extended_page])