Rails:如何在表单中使用带有select_tag的语言列表gem?

时间:2012-11-19 23:29:42

标签: ruby-on-rails

我正在尝试创建一个表单,其中一个问题是选择一种特定的语言。我试图在这里使用语言列表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") %>

任何人都可以帮助我吗?

3 个答案:

答案 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_1iso_639_3name应该已经有效了。

因此,如果用这两个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") %>