5

Railsサーバーを実行して自分のサイトの学校/新しいページに移動すると、学校の名前を入力できる「school」というラベルのフィールドが表示されますが、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 を返しました。オブジェクトをインスタンス化し、フォームを正しくレンダリングする必要がありました。


誰かが 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
于 2014-03-31T00:01:14.130 に答える
16
 <%= f.fields_for :admin do |f2| %>

fを削除してみてください。

これだけで試してください:

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

field_forを使用する方法は2つあります。

一般的なもの。(私の例のように)。

ネストされたもの。

ネストされた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オブジェクトに入れていないことです。

于 2011-08-16T19:32:46.423 に答える