在YAML中存储键,值对并用于填充Rails表单:集合?

时间:2013-05-29 11:10:22

标签: ruby-on-rails ruby-on-rails-3 refactoring

如何将带有语言代码的语言列表存储到yaml和popuplate中:以rails形式收集?我现在有下面的例子但是失败了,关于什么是解决这个问题的最佳选择的任何建议?

Application.yml:

development:
  language:     [['English', 'en'], ['French', 'fr']]

production:
  language:     [['English', 'en']

以铁轨形式:

= f.input :locale, :collection => APP_CONFIG['languages']

2 个答案:

答案 0 :(得分:2)

出于某种原因,我从来没有想过在我的i18n YAML文件中存储比字符串更复杂的数据结构,但是你的问题让我在这种情况下改变了我的方式,所以非常感谢(和+1) !

我最初在我的ApplicationHelper中有一个与@Sachin R的解决方案类似的方法(虽然与特定的Rails环境无关),如下所示:

应用/助手/ application_helper.rb

def locale_language_labels
  [
    { label: t('layouts.locale_selector.en'), locale: 'en' },
    { label: t('layouts.locale_selector.it'), locale: 'it' },
    { label: t('layouts.locale_selector.ja'), locale: 'ja' }
  ]
end

它取出了以下值(当然取决于区域设置):

<强>配置/区域设置/布局/ layouts_en.yml

en:
  layouts:
    locale_selector:
      en: English
      it: Italiano (Italian)
      ja: 日本語 (Japanese)

我的语言环境选择器(Twitter Bootstrap格式化)将填充这些值:

应用/视图/布局/ _locale_selector.html.haml

%li#fat-menu.dropdown
  %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"}
    %i.icon-globe
    = t('.language')
    %b.caret
  %ul.dropdown-menu
    - locale_language_labels.each do |language|
      %li
        = link_to language[:label],
                  controller: controller,
                  action: action,
                  set_locale: language[:locale],
                  page: page

现在,我已经摆脱了locale_language_labels方法并将我的语言环境选择器语言放在YAML文件中的哈希值中,这可能是您的问题的一个很好的候选者。我的代码现在如下所示:

<强>配置/区域设置/布局/ layouts_en.yml

en:
  layouts:
    locale_selector:
      language: Language
      language_labels: { en: English,
                         it: Italiano (Italian),
                         ja: 日本語 (Japanese) }

应用/视图/布局/ _locale_selector.html.haml

%li#fat-menu.dropdown
  %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"}
    %i.icon-globe
    = t('.language')
    %b.caret
  %ul.dropdown-menu
    - t('.language_labels').each_pair do |locale, label|
      %li
        = link_to label,
                  controller: controller,
                  action: action,
                  set_locale: locale,
                  page: page

将语言标签与YAML文件中的语言环境配对对我来说更有意义,因为它们是紧密耦合的对,现在看来YAML中定义了一半而辅助中定义了另一半似乎不自然。 / p>

答案 1 :(得分:1)

在某些应用程序hepler文件中创建一个辅助方法

def getLangCollection()
    if Rails.env == 'development'
     language = [['English', 'en'], ['French', 'fr']]
    elsif Rails.env == 'production'
     language = [['English', 'en']
    else
     language = [['English', 'en']
    return language
end