【问题标题】:Rails -- fields_for not working?Rails - fields_for 不工作?
【发布时间】:2011-08-16 19:23:44
【问题描述】:

当我运行 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 %>

【问题讨论】:

    标签: ruby-on-rails-3 fields-for


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,这帮助很大。但有时,实例化对象并不实际。在这些情况下,可以将对象提供给命令字段,例如 f.fields_for :child, child_instance
    • 也许您可以添加子关联为has_many 关系时的操作。
    • +1 建议。很好的答案,但是当关联为 has_many 时仍然对该怎么做感到困惑,因为它将是多个子对象而不是一个。
    【解决方案2】:
     <%= 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 的方法。

    这个guide 详细解释了所有可能的设置。您可能会发现它为什么不适合您。

    我敢打赌,您的 Admin 和 School 模型对象没有关系,或者您没有将 Accepts_nested_attributes_for :admin 放在您的 School 对象中。

    【讨论】:

    • f 代表@school 元素。 fields_for 单独使用,您可以传递 :something 或 "@something"。我不知道你读的是什么指南,但我推荐他们网站上的 RoR 的 API 文档。通常有很好的代码示例。玩得开心
    • 在这篇文章中,他们使用“f.fields_for” -> stackoverflow.com/questions/2613576/…。你能在这里解释一下吗?
    • 这里他们也使用fields_for前的点:stackoverflow.com/questions/2249160/…。请解释一下。
    • @Kvass 抱歉,您是对的,我的评论是在谈论通用用途..但是还有其他使用方式..请参阅我在回复中的编辑
    • 使用普通的fields_for 与使用f.fields_for 不同。你没有得到你可能想要的嵌套参数。为了解决这个问题,我必须为关联实例化一条新记录,而不是让关联为零。请参阅下面的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多