Class: ActiveModel::Name

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/active_model/naming.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, namespace = nil, name = nil, locale = :en) ⇒ Name

Returns a new ActiveModel::Name instance. By default, the namespace and name option will take the namespace and name of the given class respectively. Use locale argument for singularize and pluralize model name.

module Foo
  class Bar
  end
end

ActiveModel::Name.new(Foo::Bar).to_s
# => "Foo::Bar"

Raises:

  • (ArgumentError)


165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/active_model/naming.rb', line 165

def initialize(klass, namespace = nil, name = nil, locale = :en)
  @name = name || klass.name

  raise ArgumentError, "Class name cannot be blank. You need to supply a name argument when anonymous class given" if @name.blank?

  @unnamespaced = @name.delete_prefix("#{namespace.name}::") if namespace
  @klass        = klass
  @singular     = _singularize(@name)
  @plural       = ActiveSupport::Inflector.pluralize(@singular, locale)
  @uncountable  = @plural == @singular
  @element      = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(@name))
  @human        = ActiveSupport::Inflector.humanize(@element)
  @collection   = ActiveSupport::Inflector.tableize(@name)
  @param_key    = (namespace ? _singularize(@unnamespaced) : @singular)
  @i18n_key     = @name.underscore.to_sym

  @route_key          = (namespace ? ActiveSupport::Inflector.pluralize(@param_key, locale) : @plural.dup)
  @singular_route_key = ActiveSupport::Inflector.singularize(@route_key, locale)
  @route_key << "_index" if @uncountable
end

Instance Attribute Details

#collectionObject Also known as: cache_key

Returns the value of attribute collection.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def collection
  @collection
end

#elementObject

Returns the value of attribute element.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def element
  @element
end

#i18n_keyObject

Returns the value of attribute i18n_key.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def i18n_key
  @i18n_key
end

#nameObject

Returns the value of attribute name.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def name
  @name
end

#param_keyObject

Returns the value of attribute param_key.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def param_key
  @param_key
end

#pluralObject

Returns the value of attribute plural.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def plural
  @plural
end

#route_keyObject

Returns the value of attribute route_key.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def route_key
  @route_key
end

#singularObject

Returns the value of attribute singular.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def singular
  @singular
end

#singular_route_keyObject

Returns the value of attribute singular_route_key.



11
12
13
# File 'lib/active_model/naming.rb', line 11

def singular_route_key
  @singular_route_key
end

Instance Method Details

#human(options = {}) ⇒ Object

Transform the model name into a more human format, using I18n. By default, it will underscore then humanize the class name.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name.human # => "Blog post"

Specify options with additional translating options.



196
197
198
199
200
201
202
203
204
205
206
# File 'lib/active_model/naming.rb', line 196

def human(options = {})
  return @human if i18n_keys.empty? || i18n_scope.empty?

  key, *defaults = i18n_keys
  defaults << options[:default] if options[:default]
  defaults << MISSING_TRANSLATION

  translation = I18n.translate(key, scope: i18n_scope, count: 1, **options, default: defaults)
  translation = @human if translation == MISSING_TRANSLATION
  translation
end

#uncountable?Boolean

Returns:

  • (Boolean)


208
209
210
# File 'lib/active_model/naming.rb', line 208

def uncountable?
  @uncountable
end