diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb index 8cdd3d2fe823575a1374bf61e1d9c24112c563cf..a860388baeb35affa3f8c24ab081d724d2ade348 100644 --- a/activemodel/lib/active_model/naming.rb +++ b/activemodel/lib/active_model/naming.rb @@ -3,18 +3,36 @@ module ActiveModel class Name < String - attr_reader :singular, :plural, :element, :collection, :partial_path - alias_method :cache_key, :collection + attr_reader :singular, :plural, :element def initialize(klass) super(klass.name) @klass = klass @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze @plural = ActiveSupport::Inflector.pluralize(@singular).freeze - @element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze + @collection = nil + self.element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze + end + + def element=(element) + @element = element @human = ActiveSupport::Inflector.humanize(@element).freeze - @collection = ActiveSupport::Inflector.tableize(self).freeze - @partial_path = "#{@collection}/#{@element}".freeze + @default_collection = nil + @partial_path = nil + end + + def collection + @collection || default_collection + end + alias_method :cache_key, :collection + + def collection=(collection) + @collection = collection + @partial_path = nil + end + + def partial_path + @partial_path ||= "#{collection}/#{@element}" end # Transform the model name into a more humane format, using I18n. By default, @@ -34,6 +52,12 @@ def human(options={}) options.reverse_merge! :scope => [@klass.i18n_scope, :models], :count => 1, :default => defaults I18n.translate(defaults.shift, options) end + + private + + def default_collection + @default_collection ||= ActiveSupport::Inflector.tableize(self.sub(/[^:]*$/, @element)).freeze + end end # ActiveModel::Naming is a module that creates a +model_name+ method on your diff --git a/activemodel/test/cases/naming_test.rb b/activemodel/test/cases/naming_test.rb index dc39b84ed8cb2822370f57e38430fc795168cc2e..39180023608a24eb7d9d589d8ef656cfdc2b297b 100644 --- a/activemodel/test/cases/naming_test.rb +++ b/activemodel/test/cases/naming_test.rb @@ -18,6 +18,26 @@ def test_element assert_equal 'track_back', @model_name.element end + def test_set_element + @model_name.element = 'foo' + + assert_equal 'foo', @model_name.element + assert_equal 'Foo', @model_name.human + assert_equal 'post/foos', @model_name.collection + assert_equal 'post/foos/foo', @model_name.partial_path + end + + def test_human + assert_equal 'Track back', @model_name.human + end + + def test_set_collection + @model_name.collection = 'foo' + + assert_equal 'foo', @model_name.collection + assert_equal 'foo/track_back', @model_name.partial_path + end + def test_collection assert_equal 'post/track_backs', @model_name.collection end @@ -25,4 +45,14 @@ def test_collection def test_partial_path assert_equal 'post/track_backs/track_back', @model_name.partial_path end + + def test_should_preserve_custom_collection + @model_name.collection = 'bar' + @model_name.element = 'foo' + + assert_equal 'foo', @model_name.element + assert_equal 'Foo', @model_name.human + assert_equal 'bar', @model_name.collection + assert_equal 'bar/foo', @model_name.partial_path + end end