From d08ee5994f0b8d05997eb9c28198fb5d54ceac30 Mon Sep 17 00:00:00 2001 From: tchak Date: Wed, 21 Oct 2015 12:29:54 +0200 Subject: [PATCH] rename context to serialization_context and add url helpers --- lib/action_controller/serialization.rb | 3 ++- lib/action_controller/serialization/context.rb | 13 +++++++++++++ lib/active_model/serializer/adapter/json_api.rb | 2 +- .../serializer/adapter/json_api/pagination_links.rb | 6 +++--- lib/active_model/serializer/railtie.rb | 12 ++++++++++++ lib/active_model_serializers.rb | 2 ++ test/adapter/json_api/pagination_links_test.rb | 4 ++-- 7 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 lib/action_controller/serialization/context.rb diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index 1158e9751..0a3fdc044 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/class/attribute' +require 'action_controller/serialization/context' module ActionController module Serialization @@ -46,7 +47,7 @@ def use_adapter? [:_render_option_json, :_render_with_renderer_json].each do |renderer_method| define_method renderer_method do |resource, options| - options.fetch(:context) { options[:context] = request } + options.fetch(:serialization_context) { options[:serialization_context] = Context.new(request) } serializable_resource = get_serializer(resource, options) super(serializable_resource, options) end diff --git a/lib/action_controller/serialization/context.rb b/lib/action_controller/serialization/context.rb new file mode 100644 index 000000000..304b90255 --- /dev/null +++ b/lib/action_controller/serialization/context.rb @@ -0,0 +1,13 @@ +module ActionController + module Serialization + class Context + attr_reader :request_url, :query_parameters, :url_helpers + + def initialize(request) + @request_url = request.original_url[/\A[^?]+/] + @query_parameters = request.query_parameters + @url_helpers = ActiveModelSerializers.url_helpers + end + end + end +end diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 55f5b494f..49d79705f 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -209,7 +209,7 @@ def add_included_resources_for(serializer, include_tree, primary_data, included) end def links_for(serializer, options) - JsonApi::PaginationLinks.new(serializer.object, options[:context]).serializable_hash(options) + JsonApi::PaginationLinks.new(serializer.object, options[:serialization_context]).serializable_hash(options) end end end diff --git a/lib/active_model/serializer/adapter/json_api/pagination_links.rb b/lib/active_model/serializer/adapter/json_api/pagination_links.rb index 368d47958..9c437057b 100644 --- a/lib/active_model/serializer/adapter/json_api/pagination_links.rb +++ b/lib/active_model/serializer/adapter/json_api/pagination_links.rb @@ -41,11 +41,11 @@ def pages_from end def url(options) - @url ||= options.fetch(:links, {}).fetch(:self, nil) || original_url + @url ||= options.fetch(:links, {}).fetch(:self, nil) || request_url end - def original_url - @original_url ||= context.original_url[/\A[^?]+/] + def request_url + @request_url ||= context.request_url end def query_parameters diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model/serializer/railtie.rb index cade0354e..507df991e 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model/serializer/railtie.rb @@ -7,6 +7,18 @@ class Railtie < Rails::Railtie end end + initializer 'active_model_serializers.url_helpers' do + ActiveSupport.on_load(:action_controller) do + ActiveModelSerializers.url_helpers = Module.new do + include Rails.application.routes.url_helpers + + def self.default_url_options + ActionController::Base.default_url_options + end + end + end + end + initializer 'generators' do |app| app.load_generators require 'generators/serializer/resource_override' diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 922fd876a..28934ce28 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -7,6 +7,8 @@ module ActiveModelSerializers mattr_accessor :logger self.logger = Rails.logger || Logger.new(IO::NULL) + mattr_accessor :url_helpers + extend ActiveSupport::Autoload autoload :Model diff --git a/test/adapter/json_api/pagination_links_test.rb b/test/adapter/json_api/pagination_links_test.rb index d9fd2bec5..2cc493582 100644 --- a/test/adapter/json_api/pagination_links_test.rb +++ b/test/adapter/json_api/pagination_links_test.rb @@ -22,10 +22,10 @@ def setup def mock_request(query_parameters = {}, original_url = URI) context = Minitest::Mock.new - context.expect(:original_url, original_url) + context.expect(:request_url, original_url) context.expect(:query_parameters, query_parameters) @options = {} - @options[:context] = context + @options[:serialization_context] = context end def load_adapter(paginated_collection, options = {})