<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,19 @@
+class Class
+  def model_name
+    @model_name ||= ModelName.new(name)
+  end
+
+  class ModelName
+    attr_reader :singular, :plural, :path
+
+    def initialize(name)
+      @singular = name.underscore.tr('/', '_').freeze
+      @plural = @singular.pluralize.freeze
+      @path = &quot;#{name.tableize}/#{name.demodulize.underscore}&quot;.freeze
+    end
+  end
+end
+
 module ActionController  
   # The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or 
   # Active Resources or pretty much any other model type that has an id. These patterns are then used to try elevate
@@ -31,18 +47,21 @@ module ActionController
   module RecordIdentifier
     extend self
 
+    JOIN = '_'.freeze
+    NEW = 'new'.freeze
+
     # Returns plural/singular for a record or class. Example:
     #
     #   partial_path(post)                   # =&gt; &quot;posts/post&quot;
     #   partial_path(Person)                 # =&gt; &quot;people/person&quot;
     #   partial_path(Person, &quot;admin/games&quot;)  # =&gt; &quot;admin/people/person&quot;
     def partial_path(record_or_class, controller_path = nil)
-      klass = class_from_record_or_class(record_or_class)
+      name = model_name_from_record_or_class(record_or_class)
 
       if controller_path &amp;&amp; controller_path.include?(&quot;/&quot;)
-        &quot;#{File.dirname(controller_path)}/#{klass.name.tableize}/#{klass.name.demodulize.underscore}&quot;
+        &quot;#{File.dirname(controller_path)}/#{name.path}&quot;
       else
-        &quot;#{klass.name.tableize}/#{klass.name.demodulize.underscore}&quot;
+        name.path
       end
     end
 
@@ -56,7 +75,8 @@ module ActionController
     #   dom_class(post, :edit)   # =&gt; &quot;edit_post&quot;
     #   dom_class(Person, :edit) # =&gt; &quot;edit_person&quot;
     def dom_class(record_or_class, prefix = nil)
-      [ prefix, singular_class_name(record_or_class) ].compact * '_'
+      singular = singular_class_name(record_or_class)
+      prefix ? &quot;#{prefix}#{JOIN}#{singular}&quot; : singular
     end
 
     # The DOM id convention is to use the singular form of an object or class with the id following an underscore.
@@ -69,8 +89,11 @@ module ActionController
     #
     #   dom_id(Post.new(:id =&gt; 45), :edit) # =&gt; &quot;edit_post_45&quot;
     def dom_id(record, prefix = nil) 
-      prefix ||= 'new' unless record.id
-      [ prefix, singular_class_name(record), record.id ].compact * '_'
+      if record_id = record.id
+        &quot;#{dom_class(record, prefix)}#{JOIN}#{record_id}&quot;
+      else
+        dom_class(record, prefix || NEW)
+      end
     end
 
     # Returns the plural class name of a record or class. Examples:
@@ -78,7 +101,7 @@ module ActionController
     #   plural_class_name(post)             # =&gt; &quot;posts&quot;
     #   plural_class_name(Highrise::Person) # =&gt; &quot;highrise_people&quot;
     def plural_class_name(record_or_class)
-      singular_class_name(record_or_class).pluralize
+      model_name_from_record_or_class(record_or_class).plural
     end
 
     # Returns the singular class name of a record or class. Examples:
@@ -86,12 +109,12 @@ module ActionController
     #   singular_class_name(post)             # =&gt; &quot;post&quot;
     #   singular_class_name(Highrise::Person) # =&gt; &quot;highrise_person&quot;
     def singular_class_name(record_or_class)
-      class_from_record_or_class(record_or_class).name.underscore.tr('/', '_')
+      model_name_from_record_or_class(record_or_class).singular
     end
 
     private
-      def class_from_record_or_class(record_or_class)
-        record_or_class.is_a?(Class) ? record_or_class : record_or_class.class
+      def model_name_from_record_or_class(record_or_class)
+        (record_or_class.is_a?(Class) ? record_or_class : record_or_class.class).model_name
       end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>actionpack/lib/action_controller/record_identifier.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0ccd0b569ad4df7acc37a14531606ba6f74c69f4</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Kemper</name>
    <email>jeremy@bitsweat.net</email>
  </author>
  <url>http://github.com/rails/rails/commit/c1a98209da7422965f5dd4f475603b8a3cc887e4</url>
  <id>c1a98209da7422965f5dd4f475603b8a3cc887e4</id>
  <committed-date>2008-06-06T03:03:30-07:00</committed-date>
  <authored-date>2008-06-06T03:03:30-07:00</authored-date>
  <message>Cache RecordIdentifier methods in Class#model_name wrapper</message>
  <tree>7f5cd64e16e06c8af2f73b3354aa1439c7b9db56</tree>
  <committer>
    <name>Jeremy Kemper</name>
    <email>jeremy@bitsweat.net</email>
  </committer>
</commit>
