Можете ли вы изменить отображаемые имена меток при использовании простой формы в рельсах?

Я использую простую форму в рельсах, и я хотел бы знать, есть ли способ изменить способ отображения объектов коллекции. Например у меня есть что-то вроде этого

<%= f.input :lang, :label => "Language", :collection => [ "en", "es, "zh", "fr" ] %>

Вместо того, чтобы отображаться как «en es zh» и т. д., я бы хотел, чтобы он отображался для пользователя как «английский испанский» и т. д. Есть ли способ сделать что-то подобное?

Заранее спасибо.


person SlowBucket    schedule 02.12.2012    source источник


Ответы (5)


Вы также можете использовать следующий способ:

В модели:

    LANGUAGES = {'English' => 'en','French' => 'fr'}

Ввиду:

    <%= f.input :lang, :label => "Language", :collection => Model::LANGUAGES %>
person Community    schedule 02.12.2012

Я предполагаю, что метка будет "английская" и значение "en"; вы можете сделать что-то вроде этого:

Сохраните данные в модели (рекомендуется) или сделайте хэш:

@data = Language.all

В представлении используйте label_method и value_method:

<%= f.input :lang, :label => "Language", :collection => @data, :label_method => :name, :value_method => :value %>

Проверьте раздел Коллекции в https://github.com/plataformatec/simple_form.

person pablomarti    schedule 02.12.2012

Другой вариант - добавить помощника

def languages_display
  [
    ["English", "en"],
    ["Spanish", "sn"],
    ["French", "fr"],
  ]
end

А затем вызовите своего помощника из поля ввода:

<%= f.input :state, :collection => languages_display %>

И затем в вашем представлении show вы можете вызвать следующий помощник, чтобы он отображал английский язык, а не en, ​​который у вас есть в db:

def show_language(language)
  {
    "en" => 'English',
    "sp" => 'Spanish',
    "fr" => 'French'
  }[language]
end
person Steve    schedule 02.12.2012

 <%= f.input :lang, label: "Language", collection: [ [ "English", "en" ], [ "Spanish", "es" ], [ "French", "fr" ] ] %>

Это работает выше, используйте вложенный массив. Кроме того, это было использовано в последних рельсах и простой форме.

person colby taperts    schedule 14.08.2016

Мой подход заключается в том, чтобы поместить всю коллекцию в файл yml локали (en.yml):

#RAILSROOT/locales/en.yml
en:
  collections:
    languages: 
      - - en
        - English
      - - de
        - Deutch

и в поле зрения просто напишите:

<%= f.input :lang, :label => "Language", :collection => t("collections.languages") %>

Я использую это МНОГО, поэтому я даже написал гем со вспомогательными функциями, которые расширяют I18n (https://github.com/rstgroup/i18n-structure), и с этим в gemfile вы можете написать (обратите внимание на помощника «tc»)

<%= f.input :lang, :label => "Language", :collection => tc(:languages) %>
person wojtekk    schedule 14.10.2014