Extend ActiveRecord::Enum for add more helpful methods, from rails/rails#36503.
🚨 This Gem does not change the way you use ActiveRecord::Enum, just adds method extensions.
class Book
enum status: %i[draft published archived]
endNow we have status_name, status_color, status_value and Book.status_options methods:
#{attribute}_name- return I18n name for display.#{attribute}_color- return color for enum value from I18n file.#{attribute}_value- return raw value for enum, Now we don't need useBook.statuses[@book.status].Book.#{attribute}_options- return a array list for select tag options,<%= f.select :status, Book.status_options %>.
Write I18n:
en:
activerecord:
enums:
book:
status:
draft: Drafting
published: Published
archived: Archived
status_color:
draft: '#999999'
published: 'green'
archived: 'red'
zh-CN:
activerecord:
enums:
book:
status:
draft: '草稿'
published: '已发布'
archived: '归档'use the methods:
irb> @book = Book.new(status: :draft)
irb> @book.status_value
0
irb> @book.status_name
"草稿"
irb> @book.status_color
"#999999"
# You can still use the original methods from ActiveRecord::Enum
irb> @book.status
"draft"
irb> @book.draft?
true
irb> @book.published!
irb> @book.published?
true
irb> @book.status
"published"For _options methods for select helper:
<% form_for(@book) do |f| %>
<%= f.text_field :name %>
<%= f.select :status, Book.status_options %>
<%= f.submit %>
<% end >
Add this line to your application's Gemfile:
gem 'enumize'And then execute:
$ bundleYou can write color config in en.yml once for all locales, so follow the I18n fallback, the others locale will
use color value from en:
config/application.rb
module Dummy
class Application < Rails::Application
# Add to tell I18n fallback translate to en
config.i18n.available_locales = ["en", "zh-CN"]
config.i18n.fallbacks = true
end
endThe gem is available as open source under the terms of the MIT License.