如何将数组包含到模型支持表单的参数中

时间:2013-08-04 22:24:15

标签: ruby-on-rails ruby forms nested-forms params

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

我的设置:

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 mockup new tracking

我的表单:

= 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]"

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果你这样做......

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

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

相关问题