提交 6e5aed05 编写于 作者: P Piotr Sarnacki

Prepared ActiveModel::Naming to handle cases for namespaced isolated engines

上级 34cd8a68
...@@ -2,18 +2,22 @@ ...@@ -2,18 +2,22 @@
module ActiveModel module ActiveModel
class Name < String class Name < String
attr_reader :singular, :plural, :element, :collection, :partial_path attr_reader :singular, :plural, :element, :collection, :partial_path, :route_key, :param_key
alias_method :cache_key, :collection alias_method :cache_key, :collection
def initialize(klass) def initialize(klass, namespace = nil)
super(klass.name) super(klass.name)
@unnamespaced = self.sub(/^#{namespace.name}::/, '') if namespace
@klass = klass @klass = klass
@singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze @singular = _singularize(self).freeze
@plural = ActiveSupport::Inflector.pluralize(@singular).freeze @plural = ActiveSupport::Inflector.pluralize(@singular).freeze
@element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze @element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze
@human = ActiveSupport::Inflector.humanize(@element).freeze @human = ActiveSupport::Inflector.humanize(@element).freeze
@collection = ActiveSupport::Inflector.tableize(self).freeze @collection = ActiveSupport::Inflector.tableize(self).freeze
@partial_path = "#{@collection}/#{@element}".freeze @partial_path = "#{@collection}/#{@element}".freeze
@param_key = (namespace ? _singularize(@unnamespaced) : @singular).freeze
@route_key = (namespace ? ActiveSupport::Inflector.pluralize(@param_key) : @plural).freeze
end end
# Transform the model name into a more humane format, using I18n. By default, # Transform the model name into a more humane format, using I18n. By default,
...@@ -36,6 +40,11 @@ def human(options={}) ...@@ -36,6 +40,11 @@ def human(options={})
options.reverse_merge! :scope => [@klass.i18n_scope, :models], :count => 1, :default => defaults options.reverse_merge! :scope => [@klass.i18n_scope, :models], :count => 1, :default => defaults
I18n.translate(defaults.shift, options) I18n.translate(defaults.shift, options)
end end
private
def _singularize(str)
ActiveSupport::Inflector.underscore(str).tr('/', '_')
end
end end
# == Active Model Naming # == Active Model Naming
...@@ -58,7 +67,8 @@ module Naming ...@@ -58,7 +67,8 @@ module Naming
# Returns an ActiveModel::Name object for module. It can be # Returns an ActiveModel::Name object for module. It can be
# used to retrieve all kinds of naming-related information. # used to retrieve all kinds of naming-related information.
def model_name def model_name
@_model_name ||= ActiveModel::Name.new(self) namespace = self.parents.detect { |n| n.respond_to?(:_railtie) }
@_model_name ||= ActiveModel::Name.new(self, namespace)
end end
# Returns the plural class name of a record or class. Examples: # Returns the plural class name of a record or class. Examples:
...@@ -85,6 +95,14 @@ def self.uncountable?(record_or_class) ...@@ -85,6 +95,14 @@ def self.uncountable?(record_or_class)
plural(record_or_class) == singular(record_or_class) plural(record_or_class) == singular(record_or_class)
end end
def self.route_key(record_or_class)
model_name_from_record_or_class(record_or_class).route_key
end
def self.param_key(record_or_class)
model_name_from_record_or_class(record_or_class).param_key
end
private private
def self.model_name_from_record_or_class(record_or_class) def self.model_name_from_record_or_class(record_or_class)
(record_or_class.is_a?(Class) ? record_or_class : record_or_class.class).model_name (record_or_class.is_a?(Class) ? record_or_class : record_or_class.class).model_name
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
require 'models/contact' require 'models/contact'
require 'models/sheep' require 'models/sheep'
require 'models/track_back' require 'models/track_back'
require 'models/blog_post'
class NamingTest < ActiveModel::TestCase class NamingTest < ActiveModel::TestCase
def setup def setup
...@@ -29,6 +30,86 @@ def test_partial_path ...@@ -29,6 +30,86 @@ def test_partial_path
end end
end end
class NamingWithNamespacedModelInIsolatedNamespaceTest < ActiveModel::TestCase
def setup
@model_name = ActiveModel::Name.new(Blog::Post, Blog)
end
def test_singular
assert_equal 'blog_post', @model_name.singular
end
def test_plural
assert_equal 'blog_posts', @model_name.plural
end
def test_element
assert_equal 'post', @model_name.element
end
def test_collection
assert_equal 'blog/posts', @model_name.collection
end
def test_partial_path
assert_equal 'blog/posts/post', @model_name.partial_path
end
def test_human
assert_equal 'Post', @model_name.human
end
def test_route_key
assert_equal 'posts', @model_name.route_key
end
def test_param_key
assert_equal 'post', @model_name.param_key
end
def test_recognizing_namespace
assert_equal 'Post', Blog::Post.model_name.instance_variable_get("@unnamespaced")
end
end
class NamingWithNamespacedModelInSharedNamespaceTest < ActiveModel::TestCase
def setup
@model_name = ActiveModel::Name.new(Blog::Post)
end
def test_singular
assert_equal 'blog_post', @model_name.singular
end
def test_plural
assert_equal 'blog_posts', @model_name.plural
end
def test_element
assert_equal 'post', @model_name.element
end
def test_collection
assert_equal 'blog/posts', @model_name.collection
end
def test_partial_path
assert_equal 'blog/posts/post', @model_name.partial_path
end
def test_human
assert_equal 'Post', @model_name.human
end
def test_route_key
assert_equal 'blog_posts', @model_name.route_key
end
def test_param_key
assert_equal 'blog_post', @model_name.param_key
end
end
class NamingHelpersTest < Test::Unit::TestCase class NamingHelpersTest < Test::Unit::TestCase
def setup def setup
@klass = Contact @klass = Contact
...@@ -36,6 +117,8 @@ def setup ...@@ -36,6 +117,8 @@ def setup
@singular = 'contact' @singular = 'contact'
@plural = 'contacts' @plural = 'contacts'
@uncountable = Sheep @uncountable = Sheep
@route_key = 'contacts'
@param_key = 'contact'
end end
def test_singular def test_singular
...@@ -54,6 +137,22 @@ def test_plural_for_class ...@@ -54,6 +137,22 @@ def test_plural_for_class
assert_equal @plural, plural(@klass) assert_equal @plural, plural(@klass)
end end
def test_route_key
assert_equal @route_key, route_key(@record)
end
def test_route_key_for_class
assert_equal @route_key, route_key(@klass)
end
def test_param_key
assert_equal @param_key, param_key(@record)
end
def test_param_key_for_class
assert_equal @param_key, param_key(@klass)
end
def test_uncountable def test_uncountable
assert uncountable?(@uncountable), "Expected 'sheep' to be uncoutable" assert uncountable?(@uncountable), "Expected 'sheep' to be uncoutable"
assert !uncountable?(@klass), "Expected 'contact' to be countable" assert !uncountable?(@klass), "Expected 'contact' to be countable"
......
module Blog
def self._railtie
Object.new
end
def self.table_name_prefix
"blog_"
end
class Post
extend ActiveModel::Naming
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册