嵌套表单问题 - rails

时间:2013-08-21 22:16:33

标签: ruby-on-rails ruby forms

我有一些rails嵌套表单

    = form_for @model do |f|
    ...
      = f.fields_for :user_partnership do |builder|
        - user_partners.each do |index|
          = builder.hidden_field :user_partner_id
          = content_tag(:li,index.name)

model我已设置has_many :user_partner, through: :users_partnership

所以现在我有两个问题:首先,我在fields_for进程中没有输入。因此,在发布一些SO帖后,我不得不添加此

@model = model.new
@user_partners = User_Partner.all
@user_partners.count.times{@model.users_partnership.build} 
但是这真的很难尴尬。最棘手的问题是我如何获得fields_for块的枚举器,以便我能正确设置index.name

编辑,这是我的模特

class model
  has_many :user_partners, through: :users_partnerships
  accepts_nested_attributes_for :users_partnerships
end

class User_Partner
  has_many :models, through: :users_partnerships
end

class Users_Partnership
  belongs_to :model
  belongs_to :user_partner
end

2 个答案:

答案 0 :(得分:1)

首先,fields_for围绕模型创建范围,而不是在内部标记。所以,据我所知,你应该从控制器构建你想要循环的适当模型。

其次,由于您在某些评论中指出= builder.options[:child_index]不起作用且user_partnersuser_partnerships一样多,您可以尝试这样做:

= @model.user_partnerships.each.with_index do |user_partnership,index|
    = f.fields_for :user_partnerships, user_partnership do |builder|
      %ul
        = builder.hidden_field :user_id
        = content_tag(:li, :id => "#{users[index].name})"

顺便说一句,fields_for的迭代器似乎是一个长期存在的问题,预计会有一些方法3.2来跟踪fields_for_with_index。我发现这个post很有意思,但在我的轨道3.2.13中,我没有找到任何此类方法。或许,我们可以依赖*.options[:child_index]但我从未测试过它!

答案 1 :(得分:0)

如果我正确理解您的问题,则需要为每个用户实例提供user_partners字段。

在您的控制器中,您需要

@instance_variable = @model.user_partnership.build

然后你应该遍历用户并为每个实例构建一个表单。

= form_for @model do |f|
...
 - users.each do |index|
  = f.fields_for :user_partnership do |builder|
      = builder.hidden_field :user_partner_id
      = content_tag(:li,index.name)

像其他人一样指出你的类应该继承自activerecord并且你要检查案例和复数。给指南一个阅读。 http://edgeguides.rubyonrails.org/active_record_basics.html