Объединение двух моделей в Rails для формы - PullRequest
2 голосов
/ 01 июня 2010

Я очень новичок с рельсами, и я создаю приложение 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 ]

4 голосов
/ 01 июня 2010

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

Да, это так. «Вложенные формы» и «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 %>

Параметры сообщения будут выглядеть как

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

чтобы вы могли создать страницу и расширенную страницу, например,

page = Page.new(params[:combined][:page])
extended_page = ExtendedPage.new(params[:combined][:extended_page])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...