我对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 >
这种方式在控制器中,只需要有一个模型 更新(将更新为两者)。
这可能吗?
答案 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])