diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb index b880835b41..7022146e63 100644 --- a/activemodel/lib/active_model/naming.rb +++ b/activemodel/lib/active_model/naming.rb @@ -171,6 +171,7 @@ module ActiveModel @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) @@ -179,7 +180,7 @@ module ActiveModel @route_key = (namespace ? ActiveSupport::Inflector.pluralize(@param_key, locale) : @plural.dup) @singular_route_key = ActiveSupport::Inflector.singularize(@route_key, locale) - @route_key << "_index" if @plural == @singular + @route_key << "_index" if @uncountable end # Transform the model name into a more human format, using I18n. By default, @@ -207,6 +208,10 @@ module ActiveModel I18n.translate(defaults.shift, **options) end + def uncountable? + @uncountable + end + private def _singularize(string) ActiveSupport::Inflector.underscore(string).tr("/", "_") @@ -280,7 +285,7 @@ module ActiveModel # ActiveModel::Naming.uncountable?(Sheep) # => true # ActiveModel::Naming.uncountable?(Post) # => false def self.uncountable?(record_or_class) - plural(record_or_class) == singular(record_or_class) + model_name_from_record_or_class(record_or_class).uncountable? end # Returns string to use while generating route names. It differs for diff --git a/activemodel/test/cases/naming_test.rb b/activemodel/test/cases/naming_test.rb index 16dcadc463..51fbc4cf30 100644 --- a/activemodel/test/cases/naming_test.rb +++ b/activemodel/test/cases/naming_test.rb @@ -42,6 +42,10 @@ class NamingTest < ActiveModel::TestCase def test_i18n_key assert_equal :"post/track_back", @model_name.i18n_key end + + def test_uncountable + assert_equal false, @model_name.uncountable? + end end class NamingWithNamespacedModelInIsolatedNamespaceTest < ActiveModel::TestCase