Fix #1759, Grape integration, adds serialization_context

- improves improves serialization_context to take options and not depend
on a `request` object.
- adds descriptive error on missing serialization_context.
- Document overriding `CollectionSerializer#paginated?`.
This commit is contained in:
Benjamin Fleischer
2016-05-29 16:21:45 -05:00
parent a52189c9c0
commit a7296e8a92
6 changed files with 63 additions and 14 deletions

View File

@@ -2,6 +2,7 @@ module ActiveModelSerializers
module Adapter
class JsonApi < Base
class PaginationLinks
MissingSerializationContextError = Class.new(KeyError)
FIRST_PAGE = 1
attr_reader :collection, :context
@@ -9,7 +10,13 @@ module ActiveModelSerializers
def initialize(collection, adapter_options)
@collection = collection
@adapter_options = adapter_options
@context = adapter_options.fetch(:serialization_context)
@context = adapter_options.fetch(:serialization_context) do
fail MissingSerializationContextError, <<-EOF.freeze
JsonApi::PaginationLinks requires a ActiveModelSerializers::SerializationContext.
Please pass a ':serialization_context' option or
override CollectionSerializer#paginated? to return 'false'.
EOF
end
end
def as_json

View File

@@ -1,3 +1,4 @@
require 'active_support/core_ext/array/extract_options'
module ActiveModelSerializers
class SerializationContext
class << self
@@ -22,9 +23,15 @@ module ActiveModelSerializers
attr_reader :request_url, :query_parameters, :key_transform
def initialize(request, options = {})
@request_url = request.original_url[/\A[^?]+/]
@query_parameters = request.query_parameters
def initialize(*args)
options = args.extract_options!
if args.size == 1
request = args.pop
options[:request_url] = request.original_url[/\A[^?]+/]
options[:query_parameters] = request.query_parameters
end
@request_url = options.delete(:request_url)
@query_parameters = options.delete(:query_parameters)
@url_helpers = options.delete(:url_helpers) || self.class.url_helpers
@default_url_options = options.delete(:default_url_options) || self.class.default_url_options
end

View File

@@ -1,4 +1,7 @@
# Helpers can be included in your Grape endpoint as: helpers Grape::Helpers::ActiveModelSerializers
require 'active_model_serializers/serialization_context'
module Grape
module Helpers
module ActiveModelSerializers
@@ -8,6 +11,12 @@ module Grape
#
# Example: To include pagination meta data: render(posts, meta: { page: posts.page, total_pages: posts.total_pages })
def render(resource, active_model_serializer_options = {})
active_model_serializer_options.fetch(:serialization_context) do
active_model_serializer_options[:serialization_context] = ::ActiveModelSerializers::SerializationContext.new(
original_url: request.url[/\A[^?]+/],
query_parameters: request.params
)
end
env[:active_model_serializer_options] = active_model_serializer_options
resource
end