跳至主要内容

[gem] Enumerize

# Gemfile
# Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper support
gem 'enumerize', '~> 2.3', '>= 2.3.1'

enumerize @ Github

Basic Usage

Migrate

enumerize 搭配欄位的資料格式是字串:

class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :sex
t.string :role

t.timestamps
end
end
end

Model

# ./app/models/user.rb
class User
extend Enumerize

enumerize :sex, in: [:male, :female], default: :male, predicates: true
enumerize :status, in: %i(publish private top), predicates: true
end

Controller and View

# in controller or view
User.sex.values # 取得 sex 所有的列舉值,["male", "female"]
User.sex.options # 可以用來產收 select 下拉選單的 options,[["Male", "male"], ["Female", "female"]]

user.sex.text # or @user.sex_text,取得 user 目前 sex 的值
user.sex_text # 等同於上面
user.sex.male? #=> true,檢驗 user 目前 sex 的值
user.sex.female? #=> false

使用於 <input type="select">

<!-- 使用 User.sex.options -->
<%= f.select(:sex, User.sex.options, { prompt: '- 請選擇 -' }, { class: 'custom-select' }) %>

如果在 model 的地方有使用 predicates: truepredicates: { prefix: true } ,則可以使用下列方法:

# predicates: true
user.male?
user.female?

# predicates: {prefix: true}
user.sex_female?

在 Ruby 中 Predicate methods 指的是名稱最後帶有 ? 的方法,並且會回傳布林值。

i18n

# enumerize.zh-TW.yml
zh-TW:
enumerize:
defaults:
question_type:
alliance: 異業合作
product: 產品詢問
buy: 購買問題
suggest: 服務建議
other: 其他
inv_type:
two_copies: 二聯式
three_copies: 三聯式

# enumerize.en.yml
en:
enumerize:
user<model-name>:
sex<field-name>:
male<option-name>: 'Male'
female<option-name>: 'Female'