aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model
diff options
context:
space:
mode:
authorPiotr Sarnacki <drogus@gmail.com>2010-08-31 22:17:42 +0200
committerPiotr Sarnacki <drogus@gmail.com>2010-09-03 22:59:15 +0200
commit6e5aed057f52ba7dc244104c4c9dd0a9415910ae (patch)
treec94c04060ac72232fd5227c816d65993e684408f /activemodel/lib/active_model
parent34cd8a68b1a06384d7acf3843e1eb9bea1e5f811 (diff)
downloadrails-6e5aed057f52ba7dc244104c4c9dd0a9415910ae.tar.gz
rails-6e5aed057f52ba7dc244104c4c9dd0a9415910ae.tar.bz2
rails-6e5aed057f52ba7dc244104c4c9dd0a9415910ae.zip
Prepared ActiveModel::Naming to handle cases for namespaced isolated engines
Diffstat (limited to 'activemodel/lib/active_model')
-rw-r--r--activemodel/lib/active_model/naming.rb26
1 files changed, 22 insertions, 4 deletions
diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb
index d79635cfb3..1eb1abdb52 100644
--- a/activemodel/lib/active_model/naming.rb
+++ b/activemodel/lib/active_model/naming.rb
@@ -2,18 +2,22 @@ require 'active_support/inflector'
module ActiveModel
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
- def initialize(klass)
+ def initialize(klass, namespace = nil)
super(klass.name)
+ @unnamespaced = self.sub(/^#{namespace.name}::/, '') if namespace
+
@klass = klass
- @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze
+ @singular = _singularize(self).freeze
@plural = ActiveSupport::Inflector.pluralize(@singular).freeze
@element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze
@human = ActiveSupport::Inflector.humanize(@element).freeze
@collection = ActiveSupport::Inflector.tableize(self).freeze
@partial_path = "#{@collection}/#{@element}".freeze
+ @param_key = (namespace ? _singularize(@unnamespaced) : @singular).freeze
+ @route_key = (namespace ? ActiveSupport::Inflector.pluralize(@param_key) : @plural).freeze
end
# Transform the model name into a more humane format, using I18n. By default,
@@ -36,6 +40,11 @@ module ActiveModel
options.reverse_merge! :scope => [@klass.i18n_scope, :models], :count => 1, :default => defaults
I18n.translate(defaults.shift, options)
end
+
+ private
+ def _singularize(str)
+ ActiveSupport::Inflector.underscore(str).tr('/', '_')
+ end
end
# == Active Model Naming
@@ -58,7 +67,8 @@ module ActiveModel
# Returns an ActiveModel::Name object for module. It can be
# used to retrieve all kinds of naming-related information.
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
# Returns the plural class name of a record or class. Examples:
@@ -85,6 +95,14 @@ module ActiveModel
plural(record_or_class) == singular(record_or_class)
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
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