Самый простой возможный способ - просто использовать String#humanize
от ActiveSupport.
Использование заглавных букв в первом слове, превращение подчеркиваний в пробелы и (по умолчанию) удаление завершающего символа«_id», если присутствует.Как и titleize, это предназначено для создания симпатичного вывода.
irb(main):008:0> roles.roles.keys.map(&:humanize)
=> ["User", "Vip", "Admin"]
irb(main):009:0> Profile.new(role: :admin).role.humanize
=> "Admin"
Profile.roles
дает нам отображение хеш-функции для Enum.
Вы можете использовать это для генерации тега selectс помощью:
<%= form.select :role, Profile.roles.keys.map{|k| [k.humanize, k] } %>
Вы можете получить "vip" .humanize для возврата "VIP", настроив перегиб:
# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym 'VIP'
end
Для этого может потребоваться перезапустить сервер Rails, прежде чем он заработает.
Использование модуля I18n
Но если вам нужно более гибкое решение, которое позволяет вам самостоятельно настраивать сопоставления (и работать с переводами), используйте модуль I18n :
# config/locales/en.yml
en:
activerecord:
attributes:
profile:
roles:
user: 'User'
vip: 'Very Important Person'
admin: 'Admin'
# app/helpers/users_helper.rb
module UsersHelper
def translate_role(role)
I18n.t("activerecord.attributes.user.roles.#{ role }", default: role.humanize)
end
def role_options
Profile.roles.keys.map{|k| [translate_role(k), k] }
end
end
Затем вы должны отобразить роль пользователя следующим образом:
<%= translate_role(@user.role) %>
И вы можете настроить ввод формы следующим образом:
<%= form.select :role, role_options %>