2010-06-01 2 views
2

Я очень новый с рельсами, и я строил приложение CMS backend.Объединение двух моделей в рельсы для формы

Все идет хорошо, но я хотел бы знать, возможно ли это?

В принципе у меня есть две модели:

@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

Прежде всего, я не думаю, что для этого вам нужна вторая модель. Вы можете просто определить метод 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 %> 
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 %> 

Почтовые 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]) 
Смежные вопросы