Rails - fields_for不工作?

时间:2011-08-16 19:23:45

标签: ruby-on-rails-3 fields-for

当我运行rails服务器并进入我网站上的学校/新页面时,会出现标有“学校”标签的字段,我可以在其中输入学校名称,但字段_下的所有其他字段用于输入学校管理员的信息不会显示在我的网站上 - 当我在我的表单上使用“检查元素”时,就好像他们甚至不在那里。他们为什么不出现在我的页面上?

<%= form_for(@school) do |f| %>
  <% if @school.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@school.errors.count, "error") %> prohibited this school from being saved:</h2>

      <ul>
      <% @school.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :school %><br />
    <%= f.text_field :name %>
  </div>
  <%= f.fields_for :admin do |f2| %>
    <div class="field">
      <%= f2.label "administrator name" %><br />
      <%= f2.text_field :name %>
    </div>
    <div class="field">
      <%= f2.label "administrator email" %><br />
      <%= f2.text_field :email %>
    </div>
    <div class="field">
      <%= f2.label "administrator gender" %><br />
      <%= f2.text_field :gender %>
    </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

2 个答案:

答案 0 :(得分:21)

TLDR:

出于我的目的,我必须确保表单对象的子关联填充了新记录。最初,父对象的子关联返回nil。我只需要实例化一个对象并正确呈现表单。


如果有人从Google到达这里,我和海报有同样的问题,但接受的答案对我没有帮助。

首先,一些背景知识。当您使用普通fields_for而不是f.fields_for时,字段的呈现方式会有所不同。普通版本(如上所述)不会将呈现的字段与表单的对象相关联。看看不同的输出:

fields_for

form_for @parent_instance do |f|
  f.text_field :parent_field
  fields_for :child_obj do |child_fields|
    child_fields.text_field :child_field
  end
end

呈现

<input id="parent_class_parent_field" name="parent_class[parent_field]" type="text" />
<input id="child_class_child_field" name="child_class[child_field]" type="text" />

哪些Rails将解析这些参数:

{ "parent_class" => {
      "parent_field" => "Parent field value"
    },
  "child_class" => {
      "child_field" => "Child field value"
    }
}

f.fields_for

form_for @parent_instance do |f|
  f.text_field :parent_field
  f.fields_for :child_obj do |child_fields|
    child_fields.text_field :child_field
  end
end

呈现

<input id="parent_class_parent_field" name="parent_class[parent_field]" type="text" />
<input id="parent_class_child_class_child_field" name="parent_class[child_class][child_field]" type="text" />

哪些Rails将解析这些参数:

{ "parent_class" => {
      "parent_field" => "Parent field value",
      "child_class" => {
          "child_field" => "Child field value"
        }
    }
}

不同之处在于当您使用f.fields_for时,子对象的参数仅嵌套在父对象下。因此,使用接受的答案建议使用裸fields_for didn'用于创建相关记录。

原来,f.fields_for没有呈现任何内容的原因是因为子协会是零。要修复它并让我的表单正确呈现以正确的嵌套方式返回参数,我必须在我的控制器中实例化这样的关联:

def new
  @parent = ParentClass.new
  @parent.child_obj = ChildClass.new
end

答案 1 :(得分:11)

 <%= f.fields_for :admin do |f2| %>

尝试删除f。

试试这个:

<%= fields_for :admin do |f2| %>

使用field_for有两种方法:

通用的。 (就像我的例子)。

嵌套的。

要使用嵌套的field_for(f.field_for),必须正确设置模型对象

Ex:与@school和@admin的关系

class School< ActiveRecord::Base
  has_one :admin
  accepts_nested_attributes_for :admin
end

最后,根据您在模型对象上设置关系的方式,有多种方法可以使用field_for。

这个guide 详细解释了所有可能的设置。你可能会发现为什么它不适合你。

我的赌注是你的Admin和School模型对象没有关系,或者你没有将accepts_nested_attributes_for:admin放在你的School对象中。