Skip to content

Commit 7fcc8c0

Browse files
committed
Rely solely on active_model_serializer and remove the fancy constant lookup.
1 parent 6da52c6 commit 7fcc8c0

File tree

7 files changed

+41
-79
lines changed

7 files changed

+41
-79
lines changed

actionpack/lib/action_controller/metal/serialization.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ def serialization_scope
1313
end
1414

1515
def _render_option_json(json, options)
16-
json = json.active_model_serializer.new(json, serialization_scope) if json.respond_to?(:active_model_serializer)
16+
if json.respond_to?(:active_model_serializer) && (serializer = json.active_model_serializer)
17+
json = serializer.new(json, serialization_scope)
18+
end
1719
super
1820
end
1921

actionpack/test/controller/render_json_test.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ def as_json(*)
2626
end
2727

2828
class JsonSerializable
29+
def initialize(skip=false)
30+
@skip = skip
31+
end
32+
2933
def active_model_serializer
30-
JsonSerializer
34+
JsonSerializer unless @skip
3135
end
3236

3337
def as_json(*)
@@ -89,6 +93,11 @@ def render_json_with_serializer
8993
@current_user = Struct.new(:as_json).new(:current_user => true)
9094
render :json => JsonSerializable.new
9195
end
96+
97+
def render_json_with_serializer_api_but_without_serializer
98+
@current_user = Struct.new(:as_json).new(:current_user => true)
99+
render :json => JsonSerializable.new(true)
100+
end
92101
end
93102

94103
tests TestController
@@ -166,4 +175,9 @@ def test_render_json_with_serializer
166175
assert_match '"scope":{"current_user":true}', @response.body
167176
assert_match '"object":{"serializable_object":true}', @response.body
168177
end
178+
179+
def test_render_json_with_serializer_api_but_without_serializer
180+
get :render_json_with_serializer_api_but_without_serializer
181+
assert_match '{"serializable_object":true}', @response.body
182+
end
169183
end

activemodel/lib/active_model/serializable.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require 'active_support/core_ext/hash/except'
22
require 'active_support/core_ext/hash/slice'
33
require 'active_support/core_ext/array/wrap'
4+
require 'active_support/core_ext/string/inflections'
45

56
module ActiveModel
67
# == Active Model Serializable
@@ -72,11 +73,10 @@ module Serializable
7273
autoload :JSON, "active_model/serializable/json"
7374
autoload :XML, "active_model/serializable/xml"
7475

75-
include ActiveModel::Serializer::Scope
76-
7776
module ClassMethods #:nodoc:
78-
def _model_serializer
79-
@_model_serializer ||= ActiveModel::Serializer::Finder.find(self, self)
77+
def active_model_serializer
78+
return @active_model_serializer if defined?(@active_model_serializer)
79+
@active_model_serializer = "#{self.name}Serializer".safe_constantize
8080
end
8181
end
8282

@@ -108,8 +108,8 @@ def serializable_hash(options = nil)
108108
end
109109

110110
# Returns a model serializer for this object considering its namespace.
111-
def model_serializer
112-
self.class._model_serializer
111+
def active_model_serializer
112+
self.class.active_model_serializer
113113
end
114114

115115
private

activemodel/lib/active_model/serializer.rb

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
require "active_support/core_ext/class/attribute"
22
require "active_support/core_ext/string/inflections"
33
require "active_support/core_ext/module/anonymous"
4-
require "active_support/core_ext/module/introspection"
54
require "set"
65

76
module ActiveModel
@@ -15,7 +14,7 @@ def initialize(object, scope)
1514

1615
def serializable_array
1716
@object.map do |item|
18-
if serializer = Serializer::Finder.find(item, scope)
17+
if item.respond_to?(:active_model_serializer) && (serializer = item.active_model_serializer)
1918
serializer.new(item, scope)
2019
else
2120
item
@@ -30,41 +29,6 @@ def as_json(*args)
3029

3130
# Active Model Serializer
3231
class Serializer
33-
module Finder
34-
mattr_accessor :constantizer
35-
@@constantizer = ActiveSupport::Inflector
36-
37-
# Finds a serializer for the given object in the given scope.
38-
# If the object implements a +model_serializer+ method, it does
39-
# not do a scope lookup but uses the model_serializer method instead.
40-
def self.find(object, scope)
41-
if object.respond_to?(:model_serializer)
42-
object.model_serializer
43-
else
44-
scope = scope.class unless scope.respond_to?(:const_defined?)
45-
object = object.class unless object.respond_to?(:name)
46-
serializer = "#{object.name.demodulize}Serializer"
47-
48-
begin
49-
scope.const_get serializer
50-
rescue NameError => e
51-
raise unless e.message =~ /uninitialized constant ([\w_]+::)*#{serializer}$/
52-
scope.parents.each do |parent|
53-
return parent.const_get(serializer) if parent.const_defined?(serializer)
54-
end
55-
nil
56-
end
57-
end
58-
end
59-
end
60-
61-
# Defines the serialization scope. Core extension serializers
62-
# are defined in this module so a scoped lookup is able to find
63-
# core extension serializers.
64-
module Scope
65-
ArraySerializer = ::ActiveModel::ArraySerializer
66-
end
67-
6832
module Associations
6933
class Config < Struct.new(:name, :options)
7034
def serializer
@@ -216,3 +180,10 @@ def attributes
216180
end
217181
end
218182
end
183+
184+
class Array
185+
# Array uses ActiveModel::ArraySerializer.
186+
def active_model_serializer
187+
ActiveModel::ArraySerializer
188+
end
189+
end

activemodel/test/cases/serializer_test.rb

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ class User
1919
include ActiveModel::Serializable
2020

2121
attr_accessor :superuser
22-
attr_writer :model_serializer
2322

2423
def initialize(hash={})
25-
@model_serializer = nil
2624
@attributes = hash.merge(:first_name => "Jose", :last_name => "Valim", :password => "oh noes yugive my password")
2725
end
2826

@@ -33,17 +31,15 @@ def read_attribute_for_serialization(name)
3331
def super_user?
3432
@superuser
3533
end
36-
37-
def model_serializer
38-
@model_serializer || super
39-
end
4034
end
4135

4236
class Post < Model
4337
attr_accessor :comments
38+
def active_model_serializer; PostSerializer; end
4439
end
4540

4641
class Comment < Model
42+
def active_model_serializer; CommentSerializer; end
4743
end
4844

4945
class UserSerializer < ActiveModel::Serializer
@@ -428,38 +424,11 @@ def test_array_serializer
428424
post.comments = []
429425

430426
array = [model, post, comments]
431-
serializer = ActiveModel::Serializer::Finder.find(array, user).new(array, user)
427+
serializer = array.active_model_serializer.new(array, user)
432428
assert_equal([
433429
{ :model => "Model" },
434430
{ :post => { :body => "Body of new post", :comments => [], :title => "New Post" } },
435431
{ :comment => { :title => "Comment1" } }
436432
], serializer.as_json)
437433
end
438-
439-
def test_array_serializer_respects_model_serializer
440-
user = User.new(:first_name => "Jose", :last_name => "Valim")
441-
user.model_serializer = User2Serializer
442-
443-
array = [user]
444-
serializer = ActiveModel::Serializer::Finder.find(array, user).new(array, {})
445-
assert_equal([
446-
{ :user2 => { :last_name => "Valim", :first_name => "Jose", :ok => true } },
447-
], serializer.as_json)
448-
end
449-
450-
def test_finder_respects_model_serializer
451-
user = User.new(:first_name => "Jose", :last_name => "Valim")
452-
assert_equal UserSerializer, user.model_serializer
453-
454-
serializer = ActiveModel::Serializer::Finder.find(user, self).new(user, {})
455-
assert_equal({
456-
:user => { :last_name => "Valim", :first_name => "Jose"},
457-
}, serializer.as_json)
458-
459-
user.model_serializer = User2Serializer
460-
serializer = ActiveModel::Serializer::Finder.find(user, self).new(user, {})
461-
assert_equal({
462-
:user2 => { :last_name => "Valim", :first_name => "Jose", :ok => true },
463-
}, serializer.as_json)
464-
end
465434
end

activesupport/lib/active_support/dependencies.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ def get(key)
542542
key = key.name if key.respond_to?(:name)
543543
@store[key] ||= Inflector.constantize(key)
544544
end
545+
alias :[] :get
545546

546547
def safe_get(key)
547548
key = key.name if key.respond_to?(:name)

activesupport/test/class_cache_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ def test_get_constantizes_fails_on_invalid_names
4949
end
5050
end
5151

52+
def test_get_alias
53+
assert @cache.empty?
54+
assert_equal @cache[ClassCacheTest.name], @cache.get(ClassCacheTest.name)
55+
end
56+
5257
def test_safe_get_constantizes
5358
assert @cache.empty?
5459
assert_equal ClassCacheTest, @cache.safe_get(ClassCacheTest.name)

0 commit comments

Comments
 (0)