当我运行 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 %>
TLDR:
出于我的目的,我必须确保表单对象的子关联填充了新记录。最初,父对象的子关联返回 nil。我只需要实例化一个对象,表单就可以正确呈现。
<小时 />如果有人从谷歌来到这里,我遇到了与海报相同的问题,但接受的答案对我没有帮助。
首先,一些背景。当您使用纯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
不适用于创建关联记录。
事实证明,f.fields_for
没有渲染任何东西的原因是因为儿童关联为零。为了修复它并使我的表单正确呈现并以正确嵌套的方式返回参数,我必须在控制器中像这样实例化该关联:
def new
@parent = ParentClass.new
@parent.child_obj = ChildClass.new
end
<%= 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的方法,具体取决于您在模型对象上设置关系的方式。
本指南详细解释了所有可能的设置。您可能会发现为什么它不适合您。
我敢打赌,您的管理员和学校模型对象没有关系,或者您没有将accepts_nested_attributes_for :admin放在您的学校对象中。