mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user