Rails - fields_for不工作?

Kva*_*ass 4 fields-for ruby-on-rails-3

当我运行rails服务器并转到我网站上的学校/新页面时,会出现标有"学校"标签的字段,我可以在其中输入学校的名称,但是field_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 %>
Run Code Online (Sandbox Code Playgroud)

Nat*_*ace 21

TLDR:

出于我的目的,我必须确保表单对象的子关联填充了新记录.最初,父对象的子关联返回nil.我只需要实例化一个对象并正确呈现表单.


如果有人从谷歌来到这里,我和海报有同样的问题,但接受的答案对我没有帮助.

首先,一些背景.当您使用plain 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
Run Code Online (Sandbox Code Playgroud)

呈现

<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" />
Run Code Online (Sandbox Code Playgroud)

哪些Rails将解析为这些参数:

{ "parent_class" => {
      "parent_field" => "Parent field value"
    },
  "child_class" => {
      "child_field" => "Child field value"
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

呈现

<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" />
Run Code Online (Sandbox Code Playgroud)

哪些Rails将解析为这些参数:

{ "parent_class" => {
      "parent_field" => "Parent field value",
      "child_class" => {
          "child_field" => "Child field value"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于,子对象的参数仅在您使用时嵌套在父对象下f.fields_for.因此,使用接受的答案建议使用裸设备fields_for不能用于创建关联记录.

原来,原因f.fields_for是没有渲染任何东西是因为儿童协会是零.要修复它并使我的表单正确呈现以正确嵌套的方式返回参数,我必须在我的控制器中实例化这样的关联:

def new
  @parent = ParentClass.new
  @parent.child_obj = ChildClass.new
end
Run Code Online (Sandbox Code Playgroud)

  • 也许你可以添加当子关联是`has_many`关系时要做的事情. (2认同)

Cyg*_*sx1 12

 <%= f.fields_for :admin do |f2| %>
Run Code Online (Sandbox Code Playgroud)

尝试删除f.

试试这个:

<%= fields_for :admin do |f2| %>
Run Code Online (Sandbox Code Playgroud)

有两种方法可以使用field_for:

通用的.(就像我的例子).

嵌套的.

要使用嵌套的field_for(f.field_for),必须正确设置模型对象

例如:与@school和@admin的关系

class School< ActiveRecord::Base
  has_one :admin
  accepts_nested_attributes_for :admin
end
Run Code Online (Sandbox Code Playgroud)

最后,根据您在模型对象上设置关系的方式,有多种方法可以使用field_for.

指南详细介绍了所有可能的设置.你可能会发现为什么它不适合你.

我的赌注是您的Admin和School模型对象不在关系中,或者您没有在您的School对象中放置accepts_nested_attributes_for:admin.