我正在尝试创建一个表单,其中一个问题是选择一种特定的语言。我试图在这里使用语言列表gem:https://github.com/scsmith/language_list。但是,文档并没有真正告诉我如何将列表与select_tag组合在一起。
<%= form_for users_path, :method => "get" do %>
<%= label_tag "Select Country" %> <br>
<%= country_select(:user, :country, [], :include_blank => true) %> <br>
<%= label_tag "Language spoken" %>
<%= select_tag "Language", options_from_collection_for_select(LanguageList::COMMON_LANGUAGES, "id", "name") %>
<%= label_tag "City" %> <br>
<%= text_field_tag(:city) %>
<% end %>
给我错误
undefined method 'id' for afr (af) - Afrikaans:LanguageList::LanguageInfo
就行了
<%= select_tag "Language", options_from_collection_for_select(LanguageList::COMMON_LANGUAGES, "id", "name") %>
任何人都可以帮助我吗?
答案 0 :(得分:5)
请勿使用"id"
。文档说你应该使用iso_639_1
(或iso_639_3
如果你想要3个字母的代码)
<%= select_tag "Language", options_from_collection_for_select(LanguageList::COMMON_LANGUAGES, "iso_639_1", "name") %>
答案 1 :(得分:1)
LanguageList类似乎返回一个LanguageInfo实例的散列,具有名称,类型和代码等属性 - “options_from_collection_for_select”期望其第一个参数是集合(在这种情况下是散列),第二个是一个方法,返回要标识项目的值,第三个是显示字符串。
因此,当有人选择某种语言时,您要将哪些内容存储在数据库中?可能是其中一个代码,对吗?所以在这是真的,你会让第二个参数成为集合实例会响应的方法,其中(读取gem的源代码)是iso_639_1
或iso_639_3
。 name
应该已经有效了。
因此,如果用这两个iso_nnn_n值中的一个替换id
,则应显示该表单。要在数据库中实际保存语言代码,您需要在数据库中使用一列,您可能已将其作为language
。
答案 2 :(得分:0)
有时候将gem的数据转储存储在数据库中很有意义。
这是带有postgresql和rails https://github.com/serghei-topor/import-language-list-into-db-rails-sample
的示例这是gem的数据转储https://github.com/serghei-topor/language-list-csv的csv文件
select_tag如下所示:
<%= select_tag "Language", options_from_collection_for_select(Language.where(is_common:true).order(:name), "id", "name") %>