rails / 7.0.0 / activemodel / name.html /

class ActiveModel::Name

Parent:
Object
Included modules:

Attributes

cache_key [RW]
collection [RW]
element [RW]
i18n_key [RW]
name [RW]
param_key [RW]
plural [RW]
route_key [RW]
singular [RW]
singular_route_key [RW]

Public Class Methods

new (klass, namespace = nil, name = nil, locale = :en) Show source
# File activemodel/lib/active_model/naming.rb, line 166
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

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"

Public Instance Methods

!~(regexp) Show source
# File activemodel/lib/active_model/naming.rb, line 83
    

Equivalent to String#!~. Match the class name against the given regexp. Returns true if there is no match, otherwise false.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name !~ /Post/ # => false
BlogPost.model_name !~ /\d/   # => true
<→(other) Show source
# File activemodel/lib/active_model/naming.rb, line 50
    

Equivalent to String#<=>.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name <=> 'BlogPost'  # => 0
BlogPost.model_name <=> 'Blog'      # => 1
BlogPost.model_name <=> 'BlogPosts' # => -1
==(other) Show source
# File activemodel/lib/active_model/naming.rb, line 19
    

Equivalent to String#==. Returns true if the class name and other are equal, otherwise false.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name == 'BlogPost'  # => true
BlogPost.model_name == 'Blog Post' # => false
===(other) Show source
# File activemodel/lib/active_model/naming.rb, line 35
    

Equivalent to #==.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name === 'BlogPost'  # => true
BlogPost.model_name === 'Blog Post' # => false
=~(regexp) Show source
# File activemodel/lib/active_model/naming.rb, line 66
    

Equivalent to String#=~. Match the class name against the given regexp. Returns the position where the match starts or nil if there is no match.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name =~ /Post/ # => 4
BlogPost.model_name =~ /\d/   # => nil
eql?(other) Show source
# File activemodel/lib/active_model/naming.rb, line 99
    

Equivalent to String#eql?. Returns true if the class name and other have the same length and content, otherwise false.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name.eql?('BlogPost')  # => true
BlogPost.model_name.eql?('Blog Post') # => false
human (options = {}) Show source
# File activemodel/lib/active_model/naming.rb, line 197
def human(options = {})
  return @human unless @klass.respond_to?(:lookup_ancestors) &&
                       @klass.respond_to?(:i18n_scope)

  defaults = @klass.lookup_ancestors.map do |klass|
    klass.model_name.i18n_key
  end

  defaults << options[:default] if options[:default]
  defaults << @human

  options = { scope: [@klass.i18n_scope, :models], count: 1, default: defaults }.merge!(options.except(:default))
  I18n.translate(defaults.shift, **options)
end

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.

match?(regexp) Show source
# File activemodel/lib/active_model/naming.rb, line 115
    

Equivalent to String#match?. Match the class name against the given regexp. Returns true if there is a match, otherwise false.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name.match?(/Post/) # => true
BlogPost.model_name.match?(/\d/) # => false
to_s() Show source
# File activemodel/lib/active_model/naming.rb, line 131
    

Returns the class name.

class BlogPost
  extend ActiveModel::Naming
end

BlogPost.model_name.to_s # => "BlogPost"
to_str() Show source
# File activemodel/lib/active_model/naming.rb, line 151
delegate :==, :===, :<=>, :=~, :"!~", :eql?, :match?, :to_s,
         :to_str, :as_json, to: :name

Equivalent to to_s.

uncountable? () Show source
# File activemodel/lib/active_model/naming.rb, line 212
def uncountable?
  @uncountable
end

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.