1

我有一些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
4

2 回答 2

1

首先,fields_for围绕模型创建一个范围,而不是在内部标记。因此,据我所知,您应该从控制器构建它,并使用您想要循环的适当模型。

其次,由于您在一些评论中指出= builder.options[:child_index]不起作用并且有user_partnersas 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})"

顺便说一句, for 的迭代器fields_for似乎是一个长期存在的问题,并且预计会与 rails 3.2some method一起出现fields_for_with_index。我发现这篇文章很有趣,但是在我的 rails3.2.13中,我没有找到任何这种方法。所以也许,我们可以依赖*.options[:child_index]但我从未测试过它!

于 2013-08-22T00:18:24.607 回答
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

于 2013-08-21T23:07:10.487 回答