Rails - fields_for не работает? - PullRequest
       31

Rails - fields_for не работает?

4 голосов
/ 16 августа 2011

Когда я запускаю сервер 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 ]

21 голосов
/ 31 марта 2014

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
11 голосов
/ 16 августа 2011
 <%= 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 не связан, или вы не добавили accepts_nested_attributes_for: admin в свой объект School.

...