Как создать ассоциацию для вложенной модели в форме - PullRequest
0 голосов
/ 12 января 2010

В моем приложении Ruby on Rails я хочу разрешить добавление / редактирование вложенной модели, которая сама имеет связанную модель.

model Survey
   string title
   has_many questions

model Question
   string question
   belongs_to category

model Category
   string name

Ради аргумента давайте предположим, что пользователь всегда должен вводить новую категорию при вводе вопроса (я не мог придумать лучшего примера, вздох).

В моей модели / survey / edit.html.erb у меня есть рабочая установка для добавления вопросов и их сохранения. Однако, когда я добавил модель Category к изображению, я столкнулся с проблемой, что при добавлении нового Question не отображается соответствующее поле имени Category. Я подозреваю, что это потому, что, хотя я вызываю Question.new, я не вызываю question.category.build - и я не знаю, где и как это сделать.

Мой edit.html.erb:

<h1>Editing Survey</h1>

<%= render :partial => 'form' %>

Мой _form.html.erb:

<% form_for(@survey) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>

  <div id="questions">
    <% f.fields_for :questions do |q| %>
      <%= render :partial => 'question', :locals => { :pf => q } %>
    <% end %>
  </div>

  <%= add_a_new_child_link("New question", f, :questions) %>
<% end %>

Мой _question.html.erb:

<div class="question">
  <%= pf.label :question %>
  <%= pf.text_field :question %>

  <% pf.fields_for :category do |c| %>
    <p>
      <%= c.label :name, "Category:" %>
      <%= c.text_field :name %>
    </p>
  <% end %>
</div>

1 Ответ

0 голосов
/ 12 января 2010

Быстрое решение для вашей ситуации - использование виртуальных атрибутов. Например, в вашем вопросе модель:

def category_name=(new_name)
 if category then
   category.name = new_name
 else
   category = Category.new(:name => new_name)
 end
end

def category_name
  return category.name if category 
  ""
end

В вашем вопросе нет необходимости использовать вложенную форму. Просто добавьте что-то вроде:

<%= pf.text_field :category_name %>

Я не проверял это, но вы, вероятно, поймали идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...