Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: How to use i18n with Rails 4 enums

Rails 4 Active Record Enums are great, but what is the right pattern for translating with i18n?

like image 520
Chris Beck Avatar asked Apr 03 '14 03:04

Chris Beck


2 Answers

Starting from Rails 5, all models will inherit from ApplicationRecord.

class User < ApplicationRecord   enum status: [:active, :pending, :archived] end 

I use this superclass to implement a generic solution for translating enums:

class ApplicationRecord < ActiveRecord::Base   self.abstract_class = true    def self.human_enum_name(enum_name, enum_value)     I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}")   end end 

Then I add the translations in my .yml file:

en:   activerecord:     attributes:       user:         statuses:           active: "Active"           pending: "Pending"           archived: "Archived" 

Finally, to get the translation I use:

User.human_enum_name(:status, :pending) => "Pending" 
like image 175
Repolês Avatar answered Oct 13 '22 20:10

Repolês


I didn't find any specific pattern either, so I simply added:

en:   user_status:     active:   Active     pending:  Pending...     archived: Archived 

to an arbitrary .yml file. Then in my views:

I18n.t :"user_status.#{user.status}" 
like image 42
pierrea Avatar answered Oct 13 '22 21:10

pierrea