0

我有一个复杂的模型支持表单,并希望将多个对象包含到我的参数中。

我的设置:

网络.rb

class Network < ActiveRecord::Base                 # t.string "name"
  has_many :trackings
  has_many :installations, through: :trackings  
end

安装.rb

class Installation < ActiveRecord::Base            # t.string "name"
  has_many :trackings
  has_many :networks, through: :trackings
end

跟踪.rb

class Tracking < ActiveRecord::Base                # t.string "code
  belongs_to :network                              # t.integer "network_id",
  belongs_to :installation                         # t.integer "installation_id
end

当我创建一个新的跟踪对象时,我想渲染数据库中的每个网络并为 :code 添加一个文本字段模拟新的跟踪

我的表格:

= form_for [:admin, @tracking] do |f|

  = f.select :installation_id, options_for_select(Installation.all.map { |i| [i.name, i.id] }), prompt: "Select an Installation"

  - Network.all.each do |network|
    = f.text_field :code
  = f.submit

目前所有文本字段都被渲染但是当我提交时,只有最后一个文本字段的最后一个输入进入我的参数。我怎样才能包括所有这些?

对于非模型支持的表单,我发现了这个,但它不适用于我的表单:

= text_field_tag "tracking[][code]"
4

2 回答 2

0

问题是当一个视图被渲染时,它都被翻译成适合 HTML PUT 的格式,它不支持数组。您需要为每个代码字段分配不同的名称,可能在分隔符之后将数组索引附加到每个代码字段的末尾(:code-2例如)。然后每个值都有自己的参数。发布表单后,您可以使用分隔符拆分名称以查找以 开头的名称post,并取回数组索引,以便您可以再次将其分配给数组。

于 2013-08-04T22:55:20.637 回答
0

问题是网络每次迭代中的所有表单字段都具有相同的名称,因此它们都映射到输入哈希上的相同位置......这就是为什么您只看到最后一个条目的原因。

如果你这样做...

=text_field_tag "admin[][code[][#{network_id}]]"

...您将作为键code返回哈希network_id,用户输入作为值。因此,您将获得可以操作的单独值。

于 2013-08-04T23:11:14.443 回答