Project

vinber

0.0
No commit activity in last 3 years
No release in over 3 years
Vinber is a rails enumeration tool, much easier for i18n.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.14
~> 10.0
 Project Readme

Vinber

Enumeration with I18N solution for Rails, which without force output formatting and force method defining.

NOTE: vinber works fine with Rails 4.x or later.

Installation

# Manually from RubyGems.org
$ gem install vinber

# Or Gemfile if you are using Bundler
$ gem vinber

Usage

To use vinber is as simple as defining table attribute in its Model, and using Hash or Array are supported:

# app/models/user.rb
# User(id: integer, name: string, :status: integer, language: string)
class User < ActiveRecord::Base

  vinber :status => {:registered => 1, :active => 2, :locked => 3}

end

This provides you with a couple of public methods for class User and its instances:

User.defined_vinbers             # => {'status' => {:registered => 1, :active => 2, :locked => 3}}
User.vinber_defined?             # => true
User.vinber_defined?(:status)    # => true
User.vinber_defined?(:language)  # => false
User.vinbers.status              # => {:registered => 1, :active => 2, :locked => 3}
User.vinber_list(:status)        # => [['Registered', 1], ['Active', 2], ['Locked', 3]]

# We assume there are a lot of records in User Table
User.first.status                # => 2
User.first.vinber_value(:status) # => 'Active'

# if the attribute not defined by vinber, vinber_value return the real value
User.vinber_defined?(:id)        # => false
User.first.vinber_value(:id)     # => 1

i18n

You will be able to use i18n of vinber when you defines attribute with Hash, as default, vinber always try to find the translation from current local yaml file. if not found, vinber will fetch the attribute and return the right hash key string.

User.first.status                # => 2
User.first.vinber_value(:status) # => 'Active'
User.vinber_list(:status)        # => [['Registered', 1], ['Active', 2], ['Locked', 3]]

Setting locale like below format:

# config/locales/zh.yml or en.yml(any yml your want)
zh:
  vinber:
    User:
      status_registered: 已注册
      status_active: 已激活
      status_locked: 锁定中

If current locale is zh, you will see:

User.first.vinber_value(:status) # => '已激活'
User.vinber_list(:status)        # => [['已注册', 1], ['已激活', 2], ['锁定中', 3]]

Alternative, if you don't want it to be translated, just use :t => false, this will be useful when you writing api program, you don't want different locals to change the result.

User.first.vinber_value(:status, :t => false) # => 'active'
User.vinber_list(:status, :t => false)        # => [['registered', 1], ['active', 2], ['locked', 3]]

Sometimes, the array by vinber_list is not what you expect, you could use block to customize:

User.vinber_list(:status) do |key, value|
  "#{key}: #{value}"
end
# => ["已注册: 1", "已激活: 2", "锁定中: 3"]

User.vinber_list(:status, :t => false) do |key|
  key.upcase
end
# => ["REGISTERED", "ACTIVE", "LOCKED"]

Validates

For database safety, vinber provides validates to check security of value when saving, but it's disabled by default, you can enable with option :validates => true.

class User < ActiveRecord::Base

  vinber :status => {:registered => 1, :active => 2, :locked => 3}, :validates => true

end

user = User.new(
  :name => 'Charles',
  :status => 4    # status is 4, expected in [1, 2, 3]
)
user.save            # false
user.errors.messages # {:status => ["is not included in the list"]}

TODO

  • Improve compatibility
  • Make it easy to ActiveRecord Query

License

Released under the MIT license. See LICENSE file for details.