У Rails есть вопрос "и принадлежат многим" - PullRequest
1 голос
/ 14 июня 2010

Извините за полуобобщенное название, но я все еще довольно новичок в рельсах и не могу придумать краткий способ поставить вопрос.

У меня есть базовая настройка модели habtm: Проектимеет много ресурсов и ресурс может иметь много проектов.У меня правильно настроены база данных и модели, и я могу делать все, что мне нужно, через консоль, но у меня возникают проблемы с переводом всего этого в представление.

В представлении show для Project яхотите иметь возможность создать ресурс и автоматически назначить его текущему проекту .Вот мой основной HTML:

<p>
  <b>Name:</b>
  <%=h @project.name %>
</p>

<h2>Equipment</h2>
<ul>
  <% @project.resources.each do |r| %>
    <li><%=h r.name %></li>
  <% end %>
</ul>
<h2>Add A Resource</h2>
<% form_for(@project) do |f| %>
  <%= f.error_messages %>

  <p>
    Resource Name:<br />
    <%= f.text_field :resources %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

Очевидно, что эта форма не будет работать, но я не знаю, что делать дальше.Я искал различные примеры, но не нашел ни одного для того, что я пытаюсь сделать здесь.

Одна вещь, о которой я подумал, это изменить форму на form_for(Resource.new) и включить скрытый ввод @project.id.И затем, когда resource_controller обрабатывает форму, проверьте этот идентификатор и перейдите оттуда.Это похоже на уродливый клудж.

Ответы [ 2 ]

2 голосов
/ 15 июня 2010

Если вы используете Rails 2.3 или новее, вы можете попробовать использовать accepts_nested_attributes_for, чтобы ваш Проект автоматически создавал Ресурс, когда он получает атрибуты для нового ресурса.У него также есть то преимущество, что в вашем контроллере не требуется ничего особенного.

Райан Дейгл написал отличное введение в acceptpts_nested_attributes_for , а также есть хороший Railscast (# 196).

Я не пробовал это с отношениями HABTM, но я думаю, что это будет работать аналогично примеру has_many.

1 голос
/ 14 июня 2010

Я считаю, что вы должны использовать что-то вроде

<% form_for(@project) do |f| %>
   <%= f.error_messages %>
   <% f.fields_for :resources do |resource_fields| %>
      <%= resource_fields.text_field :name %>          
   <% end %>
<% end %>

, но я действительно не уверен!;]

...