如何在表单中为嵌套模型创建关联

时间:2010-01-11 23:15:41

标签: ruby-on-rails

在我的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 :(得分:0)

快速解决您的情况是使用虚拟属性。 EG,在你的问题模型中:

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

在你的_question中,不需要使用嵌套表单。只需添加以下内容:

<%= pf.text_field :category_name %>

我没有测试它,但你可能已经抓住了想法。