collection_select:TypeError:[“foo”,“bar”,“baz”]不是符号也不是字符串

时间:2018-06-14 10:19:04

标签: ruby-on-rails

我有一个Imagecapturing表,列city。我想实现一个搜索表单选择下拉城市列表。

在我看来,我有一个表单,应该显示一个包含城市的下拉列表:

<%= form_tag imagecapturings_path, method: :get do %>
   <%= collection_select(nil, :imagecapturing_id, Imagecapturing.all, :ort, Imagecapturing.cities, prompt: false) %>
   <%= submit_tag("Search", :name=>"submit") %>
<% end %>

在model / imagecapturing.rb中:

  def self.cities
    Imagecapturing.distinct.pluck(:city).sort!
  end

在我的浏览器中,收到错误消息:TypeError in Imagecapturings#index ["foo","bar","baz"] is not a symbol nor a string

如何修复collection_select方法调用?

2 个答案:

答案 0 :(得分:1)

<%= collection_select(nil, :imagecapturing_id, Imagecapturing.all, :ort, Imagecapturing.cities, prompt: false) %>

在上面的行中,Imagecapturing.cities返回一个数组。它需要一个字符串或符号。简单来说,它需要为每个选项显示需要的文本值。

请参阅此代码

<%= form_tag charges_path, method: :get do %>
   <%= collection_select(nil, :id, ImageCapturing.all, :id, :city_name, prompt: false) %>
   <%= submit_tag("Search", :name=>"submit") %>
<% end %>

我的模特是

class ImageCapturing < ApplicationRecord

    def city_name
        self.city
    end
end

相应地修改ID。

谢谢, 阿吉特

答案 1 :(得分:1)

当您将nil作为第一个arg传递给collection_select时,它看起来好像您应该使用select_tag。这需要更新如下:

<%= form_tag imagecapturings_path, method: :get do %>
   <%= select_tag :imagecapturing_id, options_from_collection_for_select(
     Imagecapturing.all, :ort, :city_name, prompt: false # plus any other desired options
   ) %>
   <%= submit_tag("Search", :name=>"submit") %>
<% end %>

据我所知,collection_select设计用于表单对象,而select_tag在没有用户的情况下运行,就像在用例中一样。

options_from_collection_for_select然后以与您指定的方式类似的方式获取选项 - 尽管如Ajith所指出的那样,参数应该是一个集合,后跟两个适用于此集合的方法。

第一个:ort是选择选项的值(更通常是id),第二个:city_name是其显示名称。在他们的回答中,您需要确保city_name个实例可以使用imaginecapturing方法。

然后该方法返回一个选项标签字符串,如下所示:

'<option value="#{ort}">#{city_name}</option>....and so on'

最后一部分是错误所在,将代码重新编写成上述内容可以解决您的问题。