【问题标题】:How to access nested child element in fields_for如何访问 fields_for 中的嵌套子元素
【发布时间】:2013-01-12 17:09:05
【问题描述】:

我正在尝试访问 fieds_for 中的 Hash 类型的 mongoid,并且我已经与模型建立了关系并希望访问该模型的哈希。比如:

class Leave
  field :leaves_types, :type => Hash
end

class User
  has_many :leaves
end

想做类似的事情:

form_for @user do |f|
  f.fields_for :leaves.leave_types...

我怎样才能做到这一点?提前致谢。

【问题讨论】:

  • 嘿!非常感谢。实际上,我第一次在这里提问时,屏幕阅读器无法访问“提问”视图,所以有些人如何设法提问并忘记了格式。

标签: ruby-on-rails ruby mongoid


【解决方案1】:

你应该给fields_for一个。有关该方法的更多信息see docs。在您的情况下,首先,将此行添加到您的 User 模型中:

class User
  has_many :leaves
  accepts_nested_attributes_for :leaves
end

这是必需的,以便当您的表单发布时,来自表单字段的属性通过params 得到正确处理。

现在您的模板应该如下所示(为了简单起见,我假设您的 Leave 也有一个名为 foo 的简单文本字段):

<%= form_for @user do |f| %>
  ...
  <%= f.fields_for :leaves do |leave_fields| %>
    # Fields for a leave here ----v
    Foo: <%= leaves_fields.text_field :foo %>
  <% end %>
<% end %>

或者,如果您 @user.leaves 已经初始化并且您希望表单构建器将其值放入表单字段,您必须遍历 @user.leaves,将它们中的每一个作为第二个参数传递给 fields_for

<%= form_for @user do |f| %>
  ...
  <% @user.leaves.each do |leave| %>
    <%= f.fields_for :leaves, leave do |leave_fields| %>
      # Note the addition here --^
      Foo: <%= leave_fields.text_field :foo %>
    <% end %>
  <% end %>
<% end %>

但是你的问题里面还有另一个问题:你没有一个文本字段,而是一个 hash,并且没有默认的表单输入(即没有f.hash_field :leaves_types)。因此,您可能希望按照以下问题中的建议自行制作:[1][2][3]

无论如何,拥有一个 Hash 字段对我来说似乎并不常见,所以也许 Hash 可以以某种方式替换,例如,另一个 has_many 关联(不确定),在这种情况下,您只需要另一个嵌套的 fields_for

【讨论】:

  • 您好,NIA,感谢您的回复。我想我需要在提交表单后从控制器自行管理它。原因,我想将值存储在哈希值中,leaveType id 及其值。
  • 确实,在这种情况下,您可以通过添加带有字段idleave_idvalue 的新模型类LeaveType 来避免Hash,并将has_many :leave_types 添加到Leave .在这种情况下,leave_types 将返回一个数组,您可以对其进行正常迭代并再次使用fields_for。如果这仍然不适合您,那可能是因为我不完全理解“请假”和“请假类型”在您的业务逻辑中的实际含义。
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 2019-02-08
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多