我有一个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
方法调用?
答案 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'
最后一部分是错误所在,将代码重新编写成上述内容可以解决您的问题。