如何访问fields_for中的嵌套子元素

时间:2013-01-29 07:23:49

标签: ruby-on-rails ruby mongoid

我正在尝试访问Hash中的fieds_for类型的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...

我怎么能做到这一点?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该将提供给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 %>

你的问题还有另外一个:你没有文本字段,而是哈希,并且没有默认表单输入(即没有f.hash_field :leaves_types)。因此,您可能希望像在这些问题中建议的那样自行制作:[1][2][3]

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