mirror of
https://github.com/samsonjs/grape-active_model_serializers.git
synced 2026-03-25 08:45:55 +00:00
Whitelist adapter options and support extra options.
This commit is contained in:
parent
4315930a55
commit
0963774ecc
4 changed files with 69 additions and 9 deletions
17
README.md
17
README.md
|
|
@ -177,7 +177,7 @@ resource :users do
|
|||
get '/:id' do
|
||||
if conditional
|
||||
# uses UserSerializer and configured default adapter automatically
|
||||
user
|
||||
current_user
|
||||
else
|
||||
# uses specified serializer and adapter
|
||||
render current_user, serializer: ErrorSerializer, adapter: :attributes
|
||||
|
|
@ -186,6 +186,21 @@ resource :users do
|
|||
end
|
||||
```
|
||||
|
||||
```ruby
|
||||
# Adhoc serializer options can be specified in the body of the route
|
||||
resource :users do
|
||||
get '/:id' do
|
||||
render current_user, extra: { adhoc_name_option: 'value' }
|
||||
end
|
||||
end
|
||||
|
||||
class UserSerializer
|
||||
def name
|
||||
instance_options[:adhoc_name_option] # accessible in instance_options
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### Custom Metadata
|
||||
|
||||
```ruby
|
||||
|
|
|
|||
|
|
@ -38,9 +38,14 @@ module Grape
|
|||
end
|
||||
|
||||
def render(resources, extra_options = {})
|
||||
extra_options.symbolize_keys!
|
||||
env['ams_meta'] = extra_options.slice(:meta, :meta_key)
|
||||
env['ams_adapter_options'] = extra_options.except(:meta, :meta_key)
|
||||
options = extra_options.symbolize_keys
|
||||
env['ams_meta'] = options.slice(
|
||||
:meta, :meta_key
|
||||
)
|
||||
env['ams_adapter'] = options.slice(
|
||||
:adapter, :serializer, :each_serializer
|
||||
)
|
||||
env['ams_extra'] = options[:extra]
|
||||
resources
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ module Grape
|
|||
options.merge!(default_root_options) unless options.key?(:root)
|
||||
options.merge!(meta_options)
|
||||
options.merge!(adapter_options)
|
||||
options.merge!(extra_options)
|
||||
options
|
||||
)
|
||||
end
|
||||
|
|
@ -57,16 +58,22 @@ module Grape
|
|||
|
||||
def meta_options
|
||||
options = {}
|
||||
ams_meta = env['ams_meta'] || {}
|
||||
meta = ams_meta[:meta]
|
||||
meta_key = ams_meta[:meta_key]
|
||||
meta_options = env['ams_meta'] || {}
|
||||
meta = meta_options[:meta]
|
||||
meta_key = meta_options[:meta_key]
|
||||
options[:meta] = meta if meta
|
||||
options[:meta_key] = meta_key if meta && meta_key
|
||||
options
|
||||
end
|
||||
|
||||
def adapter_options
|
||||
env['ams_adapter_options'] || {}
|
||||
env['ams_adapter'] || {}
|
||||
end
|
||||
|
||||
def extra_options
|
||||
options = env['ams_extra'] || {}
|
||||
return options if options.is_a?(Hash)
|
||||
raise 'Extra options must be a hash'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ describe Grape::ActiveModelSerializers::OptionsBuilder do
|
|||
end
|
||||
|
||||
context 'adapter options' do
|
||||
let(:env) { super().merge('ams_adapter_options' => adapter_options) }
|
||||
let(:env) { super().merge('ams_adapter' => adapter_options) }
|
||||
let(:adapter_options) { {} }
|
||||
|
||||
context 'adapter' do
|
||||
|
|
@ -91,6 +91,39 @@ describe Grape::ActiveModelSerializers::OptionsBuilder do
|
|||
expect(options[:serializer]).to eq(serializer)
|
||||
end
|
||||
end
|
||||
|
||||
context 'each_serializer' do
|
||||
let(:adapter_options) { { each_serializer: each_serializer } }
|
||||
let(:each_serializer) { V2::UserSerializer }
|
||||
|
||||
it 'includes each_serializer as top-level option' do
|
||||
expect(options[:each_serializer]).to eq(each_serializer)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'extra options' do
|
||||
let(:env) { super().merge('ams_extra' => extra_options) }
|
||||
|
||||
context 'hash' do
|
||||
let(:extra_options) { { extra: 'info' } }
|
||||
|
||||
it 'includes extra options in top-level options' do
|
||||
expect(options.keys).to include(:extra)
|
||||
end
|
||||
end
|
||||
|
||||
context 'not a hash' do
|
||||
let(:extra_options) { 'extra' }
|
||||
|
||||
it 'raises an exception' do
|
||||
expect {
|
||||
options
|
||||
}.to raise_exception(
|
||||
'Extra options must be a hash'
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in a new issue