public
Created

Some handy I18nization for my ApplicationDecorator

  • Download Gist
application_decorator.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
class ApplicationDecorator < Draper::Base
 
# See +ApplicationDecorator.humanize+
def humanize(attribute, key = model.send(attribute), default = key.to_s.humanize)
self.class.humanize attribute, key, default
end
 
# By default, humanize the attributes listed.
#
# Contrived Example:
#
# class UserDecorator < ApplicationDecorator
# decorates :user
#
# humanizes :activation_status, :plan_status
#
# # Is a shortcut for:
#
# def activation_status
# humanize :activation_status
# end
#
# def plan_status
# humanize :plan_status
# end
# end
#
# See +ApplicationDecorator.humanize+ for a more detailed example.
def self.humanizes(*attrs)
attrs.each do |attr|
define_method attr do
humanize attr
end
end
end
 
# Humanize an attribute using I18n, falling back to the humanized attributes value.
#
# I tend to store attributes like `status` as underscored strings (a string that would be
# suitable for a method/variable name) sometimes a simple .humanize will do the trick when
# it comes to displaying that value in the UI user but other times you need to customize
# them a bit which is one reason I18n is great this helps automate the usage of I18n for
# such a purpose.
#
# Contrived Example:
#
# # user_decorator.rb
# class UserDecorator < ApplicationDecorator
# decorates :user
#
# def activation_status
# humanize :activation_status
# end
#
# def plan_status
# humanize :plan_status
# end
# end
#
# # en.yml
# en:
# active: Current
# user:
# activation_status:
# active: 'Activated'
#
# # Examples:
# @user.activation_status = 'active';
# @user.decorator.activation_status # => 'Activated'
#
# @user.plan_status = 'active'
# @user.decorator.plan_status # => 'Current'
#
# @user.activation_status = 'inactive'
# @user.decorator.activation_status = 'Inactive'
def self.humanize(attribute, key, default = key.to_s.humanize)
i18n_with_scoped_defaults key, [model_name.i18n_key, attribute], default
end
 
 
# Try to translate a key with I18n and a scope but fallback to less-and-less scope.
# An example will explain more clearly:
#
# i18n_with_scoped_defaults(:some_key, [:foo, :bar, :baz])
#
# Will try the following I18n translations in order:
# * foo.bar.baz.some_key
# * foo.bar.some_key
# * foo.some_key
# * some_key
#
# And if none of the I18n keys translate, it will use the default param (which defaults to
# humanizing the provided key).
#
def self.i18n_with_scoped_defaults(key, scope = [], default = key.to_s.humanize)
scope << key
key = scope.join('.').to_sym
 
defaults = []
defaults << scope.join('.').to_sym while scope.delete_at(-2)
defaults << default
 
I18n.t key, default: defaults
end
 
 
# Use humanize to generate select options for an attribute and given options.
#
# Example usage:
#
# # user.rb
# class User < AR::Base
# ROLES = %w(admin user)
# ...
# end
#
# # user_decorator.rb
# class UserDecorator < ApplicationDecorator
# humanizes :role
#
# def self.role_options
# options_for_select_with_i18n :role, User::ROLES
# end
# end
#
# # admin/users/edit.html.erb
# <%= simple_form_for @user do |f| %>
# <%= f.input :role, collection: UserDecorator.role_options %>
# ...
def self.options_for_select_with_i18n(attribute, options)
options.map do |option|
[ humanize(attribute, option), option ]
end
end
end

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.