Class: Mobility::Plugins::FallthroughAccessors
- Inherits:
-
Module
- Object
- Module
- Mobility::Plugins::FallthroughAccessors
- Defined in:
- lib/mobility/plugins/fallthrough_accessors.rb
Overview
Defines method_missing and respond_to_missing? methods for a set of
attributes such that a method call using a locale accessor, like:
article.title_pt_br
will return the value of article.title with the locale set to pt-BR around
the method call. The class is called "FallthroughAccessors" because when
included in a model class, locale-specific methods will be available even if
not explicitly defined with the locale_accessors option.
This is a less efficient (but more open-ended) implementation of locale accessors, for use in cases where the locales to be used are not known when the model class is generated.
Class Method Summary collapse
-
.apply(attributes, option) ⇒ Object
Apply fallthrough accessors plugin to attributes.
Instance Method Summary collapse
-
#initialize(*attributes) ⇒ FallthroughAccessors
constructor
A new instance of FallthroughAccessors.
Constructor Details
#initialize(*attributes) ⇒ FallthroughAccessors
Returns a new instance of FallthroughAccessors.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mobility/plugins/fallthrough_accessors.rb', line 46 def initialize(*attributes) method_name_regex = /\A(#{attributes.join('|'.freeze)})_([a-z]{2}(_[a-z]{2})?)(=?|\??)\z/.freeze define_method :method_missing do |method_name, *arguments, &block| if method_name =~ method_name_regex attribute = $1.to_sym locale, suffix = $2.split('_'.freeze) locale = "#{locale}-#{suffix.upcase}".freeze if suffix Mobility.with_locale(locale) { public_send("#{attribute}#{$4}".freeze, *arguments) } else super(method_name, *arguments, &block) end end define_method :respond_to_missing? do |method_name, include_private = false| (method_name =~ method_name_regex) || super(method_name, include_private) end end |
Class Method Details
.apply(attributes, option) ⇒ Object
Apply fallthrough accessors plugin to attributes.
41 42 43 |
# File 'lib/mobility/plugins/fallthrough_accessors.rb', line 41 def self.apply(attributes, option) attributes.model_class.include new(*attributes.names) if option end |