我有一个复杂的模型支持表单,并希望在我的参数中包含多个对象。
我的设置:
Network.rb
class Network < ActiveRecord::Base # t.string "name"
has_many :trackings
has_many :installations, through: :trackings
end
Installation.rb
class Installation < ActiveRecord::Base # t.string "name"
has_many :trackings
has_many :networks, through: :trackings
end
Tracking.rb
class Tracking < ActiveRecord::Base # t.string "code
belongs_to :network # t.integer "network_id",
belongs_to :installation # t.integer "installation_id
end
当我创建一个新的Tracking-Object时,我想渲染数据库中的每个Network并添加一个textfield: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]"
答案 0 :(得分:0)
问题在于,当渲染视图时,它会全部转换为适合HTML PUT的格式,不支持数组。您需要为每个代码字段分配一个不同的名称,可能在分隔符(例如:code-2
)之后将数组索引附加到每个代码字段的末尾。然后每个值都有自己的参数。当表单发布时,您可以使用分隔符拆分名称以查找以post
开头的名称,并返回数组索引,以便您可以再次将其分配给数组。
答案 1 :(得分:0)
问题是每次网络迭代中的所有表单字段都具有相同的名称,因此它们都映射到输入哈希中的相同位置...这就是为什么您只能看到最后一个条目。
如果你这样做......
=text_field_tag "admin[][code[][#{network_id}]]"
...您将以code
作为键,并以用户输入值作为哈希值返回network_id
。因此,您将获得可以操作的单独值。