options_for_select и i18n - PullRequest
       1

options_for_select и i18n

0 голосов
/ 19 января 2019

Наше приложение Rails имеет список допустимого языкового кода, хранящегося в массиве.

LANGUAGES = [:en,:fr,:es,:tr,:pt,:de,:it,:ga,:gr]

Переводятся через файл локалей.

  en: 'English'
  de: 'German'
  ga: 'Irish'
  fr: 'French'
  etc.

Я хотел бы отобразитьпереведенная строка в options_for_select, но этот код передает переведенное значение контроллеру, например: 'French'.

<%= f.select :language, options_for_select(t(LanguageName::LANGUAGES), f.object.language || t('fr')) %>

Обратите внимание, что этот выбор по умолчанию выберет 'fr', только если онеще не заселено.

1 Ответ

0 голосов
/ 19 января 2019

Ссылка на документ здесь: https://apidock.com/rails/v3.2.8/ActionView/Helpers/FormOptionsHelper/options_for_select

options_for_select({ "Basic" => "$20", "Plus" => "$40" }, "$40")
  <option value="$20">Basic</option>\n<option value="$40" selected="selected">Plus</option>

Предполагается, что в вашем файле локали названия языков следующие:

en:
  languages:
    en: 'English'
    de: 'German'
    ga: 'Irish'
    fr: 'French'

Я думаю, что вынужно что-то вроде следующего:

f.select :language, options_for_select(
  LanguageName::LANGUAGES.map { |lang| [t("languages.#{lang}"), lang] }.to_h
  f.object.language || t('languages.fr')
)

Конечно, всегда лучше извлечь метод из вспомогательного файла:

class ApplicationHelper
  def map_locale_names(locale)
    LanguageName::LANGUAGES.map { |lang| [t("languages.#{lang}", locale: locale), lang] }.to_h
  end
end

, чтобы ваш метод стал следующим:

f.select :language, options_for_select(
  map_locale_names(locale: params[:locale]),
  f.object.language || t('languages.fr')
)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...