错误`未定义方法`状态'为“AK”:String`为`collection_select`

时间:2015-12-13 19:15:19

标签: ruby-on-rails

将第二种方法uniq.pluck(:state)添加到下面的代码后,我收到以下错误消息:

undefined method `state' for "AK":String.

我查看了这里的所有帖子,找不到与此问题相关的任何内容。我们将非常感谢您提供的任何见解或帮助。

<%= f.collection_select :state, (Boli.order(:state).uniq.pluck(:state)), :id, :state, include_blank: true %>

谢谢@D-side,现在使用groups_collection时遇到了困难。我希望用户能够选择特定州的一组银行。获取错误消息undefined方法`map'为:id:Symbol,使用以下代码:

 <%= f.grouped_collection_select :bank, :id, Boli.order(:bank), :id, :bank, include_blank: true%>

1 个答案:

答案 0 :(得分:2)

具有单个属性名称的

pluck返回属性值数组。字符串,在你的情况下。

然而,

collection_select是在考虑模型实例的情况下构建的,因为它接受......好吧,the docs say it better无论如何:

  

collection_select(method,collection,value_method,text_method,options = {},html_options = {})

     

&LT; ...&GT;

     

:value_method:text_method参数是要在集合的每个成员上调用的方法。返回值分别用作每个<option>标记的值属性和内容。它们也可以是响应调用的任何对象,例如proc,将为集合的每个成员调用以检索值/文本。

显然,由于您已经提取了属性state的值,因此再次对结果值调用state是没有意义的。

您可以通过多种方式解决此问题。

PostgreSQL&#39; s DISTINCT ON (expr)

.uniq.pluck(:state)替换为.select("DISTINCT ON (state) id, state"),您将获得ActiveRecord模型实例,因此生成的集合中的每个元素都将包含方法idstate,{ {1}}期待。

或使用您拥有collection_select

的查询

...通过提供pluck而非proc:id,将字符串作为参数并生成适当的值。

这一切都归结为你需要的东西。