public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Cache RecordIdentifier methods in Class#model_name wrapper
jeremy (author)
Fri Jun 06 03:03:30 -0700 2008
commit  c1a98209da7422965f5dd4f475603b8a3cc887e4
tree    7f5cd64e16e06c8af2f73b3354aa1439c7b9db56
parent  0ccd0b569ad4df7acc37a14531606ba6f74c69f4
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
...
31
32
33
 
 
 
34
35
36
37
38
39
40
 
41
42
43
 
44
45
 
46
47
48
...
56
57
58
59
 
 
60
61
62
...
69
70
71
72
73
 
 
 
 
 
74
75
76
...
78
79
80
81
 
82
83
84
...
86
87
88
89
 
90
91
92
93
94
 
 
95
96
97
98
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
47
48
49
50
51
52
53
54
55
56
57
58
 
59
60
61
 
62
63
 
64
65
66
67
...
75
76
77
 
78
79
80
81
82
...
89
90
91
 
 
92
93
94
95
96
97
98
99
...
101
102
103
 
104
105
106
107
...
109
110
111
 
112
113
114
115
 
 
116
117
118
119
 
120
121
0
@@ -1,3 +1,19 @@
0
+class Class
0
+ def model_name
0
+ @model_name ||= ModelName.new(name)
0
+ end
0
+
0
+ class ModelName
0
+ attr_reader :singular, :plural, :path
0
+
0
+ def initialize(name)
0
+ @singular = name.underscore.tr('/', '_').freeze
0
+ @plural = @singular.pluralize.freeze
0
+ @path = "#{name.tableize}/#{name.demodulize.underscore}".freeze
0
+ end
0
+ end
0
+end
0
+
0
 module ActionController
0
   # The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or
0
   # Active Resources or pretty much any other model type that has an id. These patterns are then used to try elevate
0
@@ -31,18 +47,21 @@ module ActionController
0
   module RecordIdentifier
0
     extend self
0
 
0
+ JOIN = '_'.freeze
0
+ NEW = 'new'.freeze
0
+
0
     # Returns plural/singular for a record or class. Example:
0
     #
0
     # partial_path(post) # => "posts/post"
0
     # partial_path(Person) # => "people/person"
0
     # partial_path(Person, "admin/games") # => "admin/people/person"
0
     def partial_path(record_or_class, controller_path = nil)
0
- klass = class_from_record_or_class(record_or_class)
0
+ name = model_name_from_record_or_class(record_or_class)
0
 
0
       if controller_path && controller_path.include?("/")
0
- "#{File.dirname(controller_path)}/#{klass.name.tableize}/#{klass.name.demodulize.underscore}"
0
+ "#{File.dirname(controller_path)}/#{name.path}"
0
       else
0
- "#{klass.name.tableize}/#{klass.name.demodulize.underscore}"
0
+ name.path
0
       end
0
     end
0
 
0
@@ -56,7 +75,8 @@ module ActionController
0
     # dom_class(post, :edit) # => "edit_post"
0
     # dom_class(Person, :edit) # => "edit_person"
0
     def dom_class(record_or_class, prefix = nil)
0
- [ prefix, singular_class_name(record_or_class) ].compact * '_'
0
+ singular = singular_class_name(record_or_class)
0
+ prefix ? "#{prefix}#{JOIN}#{singular}" : singular
0
     end
0
 
0
     # The DOM id convention is to use the singular form of an object or class with the id following an underscore.
0
@@ -69,8 +89,11 @@ module ActionController
0
     #
0
     # dom_id(Post.new(:id => 45), :edit) # => "edit_post_45"
0
     def dom_id(record, prefix = nil)
0
- prefix ||= 'new' unless record.id
0
- [ prefix, singular_class_name(record), record.id ].compact * '_'
0
+ if record_id = record.id
0
+ "#{dom_class(record, prefix)}#{JOIN}#{record_id}"
0
+ else
0
+ dom_class(record, prefix || NEW)
0
+ end
0
     end
0
 
0
     # Returns the plural class name of a record or class. Examples:
0
@@ -78,7 +101,7 @@ module ActionController
0
     # plural_class_name(post) # => "posts"
0
     # plural_class_name(Highrise::Person) # => "highrise_people"
0
     def plural_class_name(record_or_class)
0
- singular_class_name(record_or_class).pluralize
0
+ model_name_from_record_or_class(record_or_class).plural
0
     end
0
 
0
     # Returns the singular class name of a record or class. Examples:
0
@@ -86,12 +109,12 @@ module ActionController
0
     # singular_class_name(post) # => "post"
0
     # singular_class_name(Highrise::Person) # => "highrise_person"
0
     def singular_class_name(record_or_class)
0
- class_from_record_or_class(record_or_class).name.underscore.tr('/', '_')
0
+ model_name_from_record_or_class(record_or_class).singular
0
     end
0
 
0
     private
0
- def class_from_record_or_class(record_or_class)
0
- record_or_class.is_a?(Class) ? record_or_class : record_or_class.class
0
+ def model_name_from_record_or_class(record_or_class)
0
+ (record_or_class.is_a?(Class) ? record_or_class : record_or_class.class).model_name
0
       end
0
   end
0
-end
0
\ No newline at end of file
0
+end

Comments

  • josh Fri Jun 06 08:39:35 -0700 2008

    Jeremy, much better idea than caching ALL inflector calls.