aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/naming.rb34
-rw-r--r--activemodel/test/cases/naming_test.rb30
2 files changed, 59 insertions, 5 deletions
diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb
index 8cdd3d2fe8..a860388bae 100644
--- a/activemodel/lib/active_model/naming.rb
+++ b/activemodel/lib/active_model/naming.rb
@@ -3,18 +3,36 @@ require 'active_support/inflector'
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 @@ module ActiveModel
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 dc39b84ed8..3918002360 100644
--- a/activemodel/test/cases/naming_test.rb
+++ b/activemodel/test/cases/naming_test.rb
@@ -18,6 +18,26 @@ class NamingTest < ActiveModel::TestCase
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 @@ class NamingTest < ActiveModel::TestCase
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