gpt4 book ai didi

ruby-on-rails - simple_form grouped select association 给出 "undefined method ` map'"

转载 作者:行者123 更新时间:2023-12-05 01:17:47 26 4
gpt4 key购买 nike

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

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 函数,所以出错了。我该如何解决这个问题?

最佳答案

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

相反,它似乎可以更好地处理数组。根据this documentation ,集合输入应该是这样的形式:

[
['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

然后我的关联看起来像:

= 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 专家有更简洁的方法来处理这个问题,我很想听听。

关于ruby-on-rails - simple_form grouped select association 给出 "undefined method ` map'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18810306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com