我有一些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
答案 0 :(得分:1)
首先,fields_for
围绕模型创建范围,而不是在内部标记。所以,据我所知,你应该从控制器构建你想要循环的适当模型。
其次,由于您在某些评论中指出= builder.options[:child_index]
不起作用且user_partners
与user_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