simple_form分组选择关联给出“未定义的方法`map'”

时间:2013-09-15 08:10:21

标签: ruby-on-rails forms simple-form

在我的应用程序中,用户描述建筑物。用户应该能够使用分组选择来指定建筑物存在于哪个邻域中。模型看起来像:

class Building
  include Mongoid::Document
  belongs_to :neighborhood
end

class Neighborhood
  include Mongoid::Document
  field :name,         type: String, default: nil
  field :borough,      type: String, default: nil
  field :city,         type: String, default: nil
end

使用simple_form,我正在尝试生成一个分组选择,表示建筑可能属于的邻域列表。

= building_form.association :neighborhood, as: :grouped_select, collection: Neighborhood.where(city: city), group_method: :borough

理想情况下,可以创建类似的内容:

Borough #1
  Downtown
  Uptown
Borough #2
  Suburbs
  ...

然而,我收到此错误:

undefined method `map' for "Borough #1":String

它似乎正在调用Neighborhood.borough.map,并且因为String没有map函数,所以它会出错。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

我已经挣扎了一段时间了,不幸的是,我希望从association得到的直观的“Rails”魔法似乎并不存在。它正在使用底层的Rails grouped_collection_select,它似乎不能很好地处理对象/模型。

相反,它似乎更好地处理数组。根据{{​​3}},集合输入应采用以下形式:

[
  ['group_name',
    [
      ['item-name','item-value'],
      ['item2-name','item2-value'],
      ...(more items)...
    ]
  ],
  ['group2_name',
    [
      ['item3-name','item3-value'],
      ['item4-name','item4-value'],
      ...(more items)...
    ]
  ],
  ...(more groups)...
]

MongoDB模型自然不适合这种格式,所以我在Neighborhood类上编写了一个帮助方法:

def self.grouped_by_borough(city)
  groups = []
  Neighborhood.where(city: city).distinct(:borough).each_with_index do |borough, index|
    groups << [borough, Neighborhood.where(city: city, borough: borough)]
  end
  return groups
end

然后我的association看起来像:

= building_form.association :neighborhood, as: :grouped_select, collection: Neighborhood.grouped_by_borough(city), group_method: :last, option_key_method: :name, option_value_method: :id

这也会自动选择任何先前选择的邻域,这样便于“编辑”表单。

如果有任何Rails表格/ Mongoid大师有更清晰的方式处理这个问题,我很乐意听到它。