5

当我运行 rails 服务器并转到我网站上的学校/新页面时,会出现带有“学校”标签的字段,我可以在其中输入学校名称,但 fields_for 下的所有其他字段用于输入学校管理员的信息不要出现在我的网站上——当我在我的表单上使用“检查元素”时,就好像它们甚至不存在一样。为什么他们没有出现在我的页面上?

<%= 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 %>
4

2 回答 2

22

TLDR:

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


万一有人从谷歌来到这里,我和发帖人有同样的问题,但接受的答案对我没有帮助。

首先,一些背景。当您使用 plainfields_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不适用于创建关联记录。

Turned out, the reason f.fields_for wasn't rendering anything was because the child association was nil. To fix it and have my form render correctly and return the parameters in the properly nested way, I had to instantiate that association like this in my controller:

def new
  @parent = ParentClass.new
  @parent.child_obj = ChildClass.new
end
于 2014-03-31T00:01:14.130 回答
16
 <%= f.fields_for :admin do |f2| %>

尝试删除 f。

试试这个:

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

field_for 有两种使用方式:

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

一个嵌套的。

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

例如:与@school 和@admin 的关系

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

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

指南详细解释了所有可能的设置。您可能会发现为什么它不适合您。

我敢打赌,您的 Admin 和 School 模型对象没有关系,或者您没有将 accept_nested_attributes_for :admin 放入您的 School 对象中。

于 2011-08-16T19:32:46.423 回答