diff --git a/CHANGELOG.md b/CHANGELOG.md index 5692fe54..3830190f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ * Added a "prefix" option in case you want to use a different version of serializer. +* Serializers default namespace can be set in `default_serializer_options` and inherited by associations. + # VERSION 0.8.1 * Fix bug whereby a serializer using 'options' would blow up. diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index 5b2a3d35..7ff06950 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -80,6 +80,7 @@ module ActionController def build_json_serializer(resource, options = {}) options = default_serializer_options.merge(options) + @namespace_for_serializer = options.fetch(:namespace, nil) if serializer = options.fetch(:serializer, default_serializer(resource)) options[:scope] = serialization_scope unless options.has_key?(:scope) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index aabfb651..91b61b6a 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -35,7 +35,7 @@ module ActiveModel def serializer_for(item) serializer_class = @each_serializer || Serializer.serializer_for(item, namespace: @namespace) || DefaultSerializer - serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except, polymorphic: @polymorphic) + serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except, polymorphic: @polymorphic, namespace: @namespace) end def serializable_object diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 8281b495..d5bd0028 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -131,6 +131,7 @@ end @except = options[:except] ? Array(options[:except]) : nil @key_format = options[:key_format] @context = options[:context] + @namespace = options[:namespace] end attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format, :context, :polymorphic @@ -216,7 +217,8 @@ end end def association_options_for_serializer(association) - prefix = association.options[:prefix] + prefix = association.options[:prefix] + namespace = association.options[:namespace] || @namespace || self.namespace { scope: scope }.tap do |opts| opts[:namespace] = namespace if namespace diff --git a/test/integration/action_controller/namespaced_serialization_test.rb b/test/integration/action_controller/namespaced_serialization_test.rb index 4a5fbbf9..1e758d29 100644 --- a/test/integration/action_controller/namespaced_serialization_test.rb +++ b/test/integration/action_controller/namespaced_serialization_test.rb @@ -43,5 +43,54 @@ module ActionController assert_serializer CommentSerializer end end + + class OptionNamespacedSerializationTest < ActionController::TestCase + class MyController < ActionController::Base + def default_serializer_options + { + namespace: TestNamespace + } + end + + def render_profile_with_namespace_option + render json: Profile.new({ name: 'Name 1', description: 'Description 1'}) + end + + def render_profiles_with_namespace_option + render json: [Profile.new({ name: 'Name 1', description: 'Description 1'})] + end + + def render_comment + render json: Comment.new(content: 'Comment 1') + end + + def render_comments + render json: [Comment.new(content: 'Comment 1')] + end + end + + tests MyController + + def test_render_profile_with_namespace_option + get :render_profile_with_namespace_option + assert_serializer TestNamespace::ProfileSerializer + end + + def test_render_profiles_with_namespace_option + get :render_profiles_with_namespace_option + assert_serializer TestNamespace::ProfileSerializer + end + + def test_fallback_to_a_version_without_namespace + get :render_comment + assert_serializer CommentSerializer + end + + def test_array_fallback_to_a_version_without_namespace + get :render_comments + assert_serializer CommentSerializer + end + end + end end \ No newline at end of file