Rails - fields_for не работает?
Когда я запускаю сервер 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 %>
2 ответа
<%= f.fields_for :admin do |f2| %>
попробуйте удалить е.
попробуйте только это:
<%= 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 не связан, или вы не добавили accepts_nested_attributes_for: admin в свой объект School.
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
не работал для создания связанной записи.
Оказалось, причина f.fields_for
ничего не делал, потому что детская ассоциация была нулевой. Чтобы исправить это и сделать так, чтобы моя форма правильно отображалась и возвращала параметры правильно вложенным способом, мне нужно было создать такую связь в моем контроллере следующим образом:
def new
@parent = ParentClass.new
@parent.child_obj = ChildClass.new
end