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
Другие вопросы по тегам