我们的Rails应用程序具有存储在数组中的有效语言代码列表。
LANGUAGES = [:en,:fr,:es,:tr,:pt,:de,:it,:ga,:gr]
通过语言环境文件翻译。
en: 'English'
de: 'German'
ga: 'Irish'
fr: 'French'
etc.
我想在options_for_select
中显示转换后的字符串,但是此代码会将转换后的值传递给控制器,例如:“法语”。
<%= f.select :language, options_for_select(t(LanguageName::LANGUAGES), f.object.language || t('fr')) %>
请注意,只有在尚未填充此选择时,该选择才会默认为“ fr”。
答案 0 :(得分:1)
请参阅此处的文档: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')
)
希望这会有所帮助。