mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Merge 0-10-stable into master (to fix breaking change). (#2023)
* Merge pull request #1990 from mxie/mx-result-typo Fix typos and capitalization in Relationship Links docs [ci skip] * Merge pull request #1992 from ojiry/bump_ruby_versions Run tests by Ruby 2.2.6 and 2.3.3 * Merge pull request #1994 from bf4/promote_architecture Promote important architecture description that answers a lot of questions we get Conflicts: docs/ARCHITECTURE.md * Merge pull request #1999 from bf4/typos Fix typos [ci skip] * Merge pull request #2000 from berfarah/patch-1 Link to 0.10.3 tag instead of `master` branch * Merge pull request #2007 from bf4/check_ci Test was failing due to change in JSON exception message when parsing empty string * Swap out KeyTransform for CaseTransform (#1993) * delete KeyTransform, use CaseTransform * added changelog Conflicts: CHANGELOG.md * Merge pull request #2005 from kofronpi/support-ruby-2.4 Update jsonapi runtime dependency to 0.1.1.beta6 * Bump to v0.10.4 * Merge pull request #2018 from rails-api/bump_version Bump to v0.10.4 [ci skip] Conflicts: CHANGELOG.md * Merge pull request #2019 from bf4/fix_method_redefined_warning Fix AMS warnings * Merge pull request #2020 from bf4/silence_grape_warnings Silence Grape warnings * Merge pull request #2017 from bf4/remove_warnings Fix mt6 assert_nil warnings * Updated isolated tests to assert correct behavior. (#2010) * Updated isolated tests to assert correct behavior. * Added check to get unsafe params if rails version is great than 5 * Merge pull request #2012 from bf4/cleanup_isolated_jsonapi_renderer_tests_a_bit Cleanup assertions in isolated jsonapi renderer tests a bit * Add Model#attributes helper; make test attributes explicit * Fix model attributes accessors * Fix typos * Randomize testing of compatibility layer against regressions * Test bugfix * Add CHANGELOG * Merge pull request #1981 from groyoh/link_doc Fix relationship links doc Conflicts: CHANGELOG.md
This commit is contained in:
committed by
GitHub
parent
2a6d373cb2
commit
93ca27fe44
@@ -3,6 +3,15 @@ require 'test_helper'
|
||||
module ActionController
|
||||
module Serialization
|
||||
class AdapterSelectorTest < ActionController::TestCase
|
||||
class Profile < Model
|
||||
attributes :id, :name, :description
|
||||
associations :comments
|
||||
end
|
||||
class ProfileSerializer < ActiveModel::Serializer
|
||||
type 'profiles'
|
||||
attributes :name, :description
|
||||
end
|
||||
|
||||
class AdapterSelectorTestController < ActionController::Base
|
||||
def render_using_default_adapter
|
||||
@profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
|
||||
|
||||
@@ -4,7 +4,7 @@ module ActionController
|
||||
module Serialization
|
||||
class NamespaceLookupTest < ActionController::TestCase
|
||||
class Book < ::Model
|
||||
attributes :title, :body
|
||||
attributes :id, :title, :body
|
||||
associations :writer, :chapters
|
||||
end
|
||||
class Chapter < ::Model
|
||||
@@ -86,7 +86,7 @@ module ActionController
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
||||
# the looku things we mean ::Api::V2
|
||||
# the lookup thinks we mean ::Api::V2
|
||||
render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
||||
end
|
||||
|
||||
@@ -94,7 +94,7 @@ module ActionController
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
||||
# the looku things we mean ::Api::V2
|
||||
# the lookup thinks we mean ::Api::V2
|
||||
render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
||||
end
|
||||
|
||||
|
||||
@@ -24,21 +24,56 @@ module ActiveModelSerializers
|
||||
attributes :one, :two, :three
|
||||
end
|
||||
original_attributes = { one: 1, two: 2, three: 3 }
|
||||
instance = klass.new(original_attributes)
|
||||
original_instance = klass.new(original_attributes)
|
||||
|
||||
# Initial value
|
||||
expected_attributes = { id: nil, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
instance = original_instance
|
||||
expected_attributes = { one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal 1, instance.one
|
||||
assert_equal 1, instance.read_attribute_for_serialization(:one)
|
||||
|
||||
# Change via accessor
|
||||
# FIXME: Change via accessor has no effect on attributes.
|
||||
instance = original_instance.dup
|
||||
instance.one = :not_one
|
||||
|
||||
expected_attributes = { id: nil, one: :not_one, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :not_one, instance.one
|
||||
assert_equal :not_one, instance.read_attribute_for_serialization(:one)
|
||||
|
||||
# FIXME: Change via mutating attributes
|
||||
instance = original_instance.dup
|
||||
instance.attributes[:one] = :not_one
|
||||
expected_attributes = { one: :not_one, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal 1, instance.one
|
||||
assert_equal 1, instance.read_attribute_for_serialization(:one)
|
||||
end
|
||||
|
||||
def test_attributes_can_be_read_for_serialization_with_attributes_accessors_fix
|
||||
klass = Class.new(ActiveModelSerializers::Model) do
|
||||
derive_attributes_from_names_and_fix_accessors
|
||||
attributes :one, :two, :three
|
||||
end
|
||||
original_attributes = { one: 1, two: 2, three: 3 }
|
||||
original_instance = klass.new(original_attributes)
|
||||
|
||||
# Initial value
|
||||
instance = original_instance
|
||||
expected_attributes = { one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal 1, instance.one
|
||||
assert_equal 1, instance.read_attribute_for_serialization(:one)
|
||||
|
||||
expected_attributes = { one: :not_one, two: 2, three: 3 }.with_indifferent_access
|
||||
# Change via accessor
|
||||
instance = original_instance.dup
|
||||
instance.one = :not_one
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :not_one, instance.one
|
||||
assert_equal :not_one, instance.read_attribute_for_serialization(:one)
|
||||
|
||||
# Attributes frozen
|
||||
assert instance.attributes.frozen?
|
||||
end
|
||||
|
||||
def test_id_attribute_can_be_read_for_serialization
|
||||
@@ -47,21 +82,59 @@ module ActiveModelSerializers
|
||||
end
|
||||
self.class.const_set(:SomeTestModel, klass)
|
||||
original_attributes = { id: :ego, one: 1, two: 2, three: 3 }
|
||||
instance = klass.new(original_attributes)
|
||||
original_instance = klass.new(original_attributes)
|
||||
|
||||
# Initial value
|
||||
instance = original_instance.dup
|
||||
expected_attributes = { id: :ego, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal 1, instance.one
|
||||
assert_equal 1, instance.read_attribute_for_serialization(:one)
|
||||
assert_equal :ego, instance.id
|
||||
assert_equal :ego, instance.read_attribute_for_serialization(:id)
|
||||
|
||||
# Change via accessor
|
||||
# FIXME: Change via accessor has no effect on attributes.
|
||||
instance = original_instance.dup
|
||||
instance.id = :superego
|
||||
|
||||
expected_attributes = { id: :superego, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :superego, instance.id
|
||||
assert_equal :superego, instance.read_attribute_for_serialization(:id)
|
||||
|
||||
# FIXME: Change via mutating attributes
|
||||
instance = original_instance.dup
|
||||
instance.attributes[:id] = :superego
|
||||
expected_attributes = { id: :superego, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :ego, instance.id
|
||||
assert_equal :ego, instance.read_attribute_for_serialization(:id)
|
||||
ensure
|
||||
self.class.send(:remove_const, :SomeTestModel)
|
||||
end
|
||||
|
||||
def test_id_attribute_can_be_read_for_serialization_with_attributes_accessors_fix
|
||||
klass = Class.new(ActiveModelSerializers::Model) do
|
||||
derive_attributes_from_names_and_fix_accessors
|
||||
attributes :id, :one, :two, :three
|
||||
end
|
||||
self.class.const_set(:SomeTestModel, klass)
|
||||
original_attributes = { id: :ego, one: 1, two: 2, three: 3 }
|
||||
original_instance = klass.new(original_attributes)
|
||||
|
||||
# Initial value
|
||||
instance = original_instance.dup
|
||||
expected_attributes = { id: :ego, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :ego, instance.id
|
||||
assert_equal :ego, instance.read_attribute_for_serialization(:id)
|
||||
|
||||
expected_attributes = { id: :superego, one: 1, two: 2, three: 3 }.with_indifferent_access
|
||||
# Change via accessor
|
||||
instance = original_instance.dup
|
||||
instance.id = :superego
|
||||
assert_equal expected_attributes, instance.attributes
|
||||
assert_equal :superego, instance.id
|
||||
assert_equal :superego, instance.read_attribute_for_serialization(:id)
|
||||
|
||||
# Attributes frozen
|
||||
assert instance.attributes.frozen?
|
||||
ensure
|
||||
self.class.send(:remove_const, :SomeTestModel)
|
||||
end
|
||||
|
||||
@@ -44,7 +44,7 @@ class JsonApiRendererTest < ActionDispatch::IntegrationTest
|
||||
|
||||
def define_author_model_and_serializer
|
||||
TestController.const_set(:Author, Class.new(ActiveModelSerializers::Model) do
|
||||
attributes :name
|
||||
attributes :id, :name
|
||||
end)
|
||||
TestController.const_set(:AuthorSerializer, Class.new(ActiveModel::Serializer) do
|
||||
type 'users'
|
||||
|
||||
@@ -3,11 +3,8 @@ require 'test_helper'
|
||||
module ActiveModelSerializers
|
||||
module Adapter
|
||||
class AttributesTest < ActiveSupport::TestCase
|
||||
class Person
|
||||
include ActiveModel::Model
|
||||
include ActiveModel::Serialization
|
||||
|
||||
attr_accessor :first_name, :last_name
|
||||
class Person < ActiveModelSerializers::Model
|
||||
attributes :first_name, :last_name
|
||||
end
|
||||
|
||||
class PersonSerializer < ActiveModel::Serializer
|
||||
|
||||
@@ -4,6 +4,10 @@ module ActiveModelSerializers
|
||||
module Adapter
|
||||
class Json
|
||||
class HasManyTestTest < ActiveSupport::TestCase
|
||||
class ModelWithoutSerializer < ::Model
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
def setup
|
||||
ActionController::Base.cache_store.clear
|
||||
@author = Author.new(id: 1, name: 'Steve K.')
|
||||
@@ -16,7 +20,7 @@ module ActiveModelSerializers
|
||||
@second_comment.post = @post
|
||||
@blog = Blog.new(id: 1, name: 'My Blog!!')
|
||||
@post.blog = @blog
|
||||
@tag = Tag.new(id: 1, name: '#hash_tag')
|
||||
@tag = ModelWithoutSerializer.new(id: 1, name: '#hash_tag')
|
||||
@post.tags = [@tag]
|
||||
end
|
||||
|
||||
@@ -30,7 +34,11 @@ module ActiveModelSerializers
|
||||
end
|
||||
|
||||
def test_has_many_with_no_serializer
|
||||
serializer = PostWithTagsSerializer.new(@post)
|
||||
post_serializer_class = Class.new(ActiveModel::Serializer) do
|
||||
attributes :id
|
||||
has_many :tags
|
||||
end
|
||||
serializer = post_serializer_class.new(@post)
|
||||
adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
|
||||
assert_equal({
|
||||
id: 42,
|
||||
|
||||
@@ -4,6 +4,10 @@ module ActiveModelSerializers
|
||||
module Adapter
|
||||
class JsonApi
|
||||
class HasManyTest < ActiveSupport::TestCase
|
||||
class ModelWithoutSerializer < ::Model
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
def setup
|
||||
ActionController::Base.cache_store.clear
|
||||
@author = Author.new(id: 1, name: 'Steve K.')
|
||||
@@ -26,7 +30,7 @@ module ActiveModelSerializers
|
||||
@blog.articles = [@post]
|
||||
@post.blog = @blog
|
||||
@post_without_comments.blog = nil
|
||||
@tag = Tag.new(id: 1, name: '#hash_tag')
|
||||
@tag = ModelWithoutSerializer.new(id: 1, name: '#hash_tag')
|
||||
@post.tags = [@tag]
|
||||
@serializer = PostSerializer.new(@post)
|
||||
@adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
|
||||
@@ -129,7 +133,11 @@ module ActiveModelSerializers
|
||||
end
|
||||
|
||||
def test_has_many_with_no_serializer
|
||||
serializer = PostWithTagsSerializer.new(@post)
|
||||
post_serializer_class = Class.new(ActiveModel::Serializer) do
|
||||
attributes :id
|
||||
has_many :tags
|
||||
end
|
||||
serializer = post_serializer_class.new(@post)
|
||||
adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
|
||||
|
||||
assert_equal({
|
||||
|
||||
@@ -14,11 +14,21 @@ module ActiveModel
|
||||
[{ foo: 'bar' }]
|
||||
end
|
||||
end
|
||||
class Tag < ::Model
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
class TagSerializer < ActiveModel::Serializer
|
||||
type 'tags'
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
class PostWithTagsSerializer < ActiveModel::Serializer
|
||||
type 'posts'
|
||||
attributes :id
|
||||
has_many :tags
|
||||
end
|
||||
|
||||
class IncludeParamAuthorSerializer < ActiveModel::Serializer
|
||||
class_attribute :comment_loader
|
||||
|
||||
|
||||
@@ -4,6 +4,20 @@ require 'tempfile'
|
||||
|
||||
module ActiveModelSerializers
|
||||
class CacheTest < ActiveSupport::TestCase
|
||||
class Article < ::Model
|
||||
attributes :title
|
||||
# To confirm error is raised when cache_key is not set and cache_key option not passed to cache
|
||||
undef_method :cache_key
|
||||
end
|
||||
class ArticleSerializer < ActiveModel::Serializer
|
||||
cache only: [:place], skip_digest: true
|
||||
attributes :title
|
||||
end
|
||||
|
||||
class Author < ::Model
|
||||
attributes :id, :name
|
||||
associations :posts, :bio, :roles
|
||||
end
|
||||
# Instead of a primitive cache key (i.e. a string), this class
|
||||
# returns a list of objects that require to be expanded themselves.
|
||||
class AuthorWithExpandableCacheElements < Author
|
||||
@@ -27,30 +41,32 @@ module ActiveModelSerializers
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
class UncachedAuthor < Author
|
||||
# To confirm cache_key is set using updated_at and cache_key option passed to cache
|
||||
undef_method :cache_key
|
||||
end
|
||||
class AuthorSerializer < ActiveModel::Serializer
|
||||
cache key: 'writer', skip_digest: true
|
||||
attributes :id, :name
|
||||
|
||||
class Article < ::Model
|
||||
attributes :title
|
||||
# To confirm error is raised when cache_key is not set and cache_key option not passed to cache
|
||||
undef_method :cache_key
|
||||
has_many :posts
|
||||
has_many :roles
|
||||
has_one :bio
|
||||
end
|
||||
|
||||
class ArticleSerializer < ActiveModel::Serializer
|
||||
cache only: [:place], skip_digest: true
|
||||
attributes :title
|
||||
class Blog < ::Model
|
||||
attributes :name
|
||||
associations :writer
|
||||
end
|
||||
class BlogSerializer < ActiveModel::Serializer
|
||||
cache key: 'blog'
|
||||
attributes :id, :name
|
||||
|
||||
class InheritedRoleSerializer < RoleSerializer
|
||||
cache key: 'inherited_role', only: [:name, :special_attribute]
|
||||
attribute :special_attribute
|
||||
belongs_to :writer
|
||||
end
|
||||
|
||||
class Comment < ::Model
|
||||
attributes :body
|
||||
attributes :id, :body
|
||||
associations :post, :author
|
||||
|
||||
# Uses a custom non-time-based cache key
|
||||
@@ -58,14 +74,52 @@ module ActiveModelSerializers
|
||||
"comment/#{id}"
|
||||
end
|
||||
end
|
||||
class CommentSerializer < ActiveModel::Serializer
|
||||
cache expires_in: 1.day, skip_digest: true
|
||||
attributes :id, :body
|
||||
belongs_to :post
|
||||
belongs_to :author
|
||||
end
|
||||
|
||||
class Post < ::Model
|
||||
attributes :id, :title, :body
|
||||
associations :author, :comments, :blog
|
||||
end
|
||||
class PostSerializer < ActiveModel::Serializer
|
||||
cache key: 'post', expires_in: 0.1, skip_digest: true
|
||||
attributes :id, :title, :body
|
||||
|
||||
has_many :comments
|
||||
belongs_to :blog
|
||||
belongs_to :author
|
||||
end
|
||||
|
||||
class Role < ::Model
|
||||
attributes :name, :description, :special_attribute
|
||||
associations :author
|
||||
end
|
||||
class RoleSerializer < ActiveModel::Serializer
|
||||
cache only: [:name, :slug], skip_digest: true
|
||||
attributes :id, :name, :description
|
||||
attribute :friendly_id, key: :slug
|
||||
belongs_to :author
|
||||
|
||||
def friendly_id
|
||||
"#{object.name}-#{object.id}"
|
||||
end
|
||||
end
|
||||
class InheritedRoleSerializer < RoleSerializer
|
||||
cache key: 'inherited_role', only: [:name, :special_attribute]
|
||||
attribute :special_attribute
|
||||
end
|
||||
|
||||
setup do
|
||||
cache_store.clear
|
||||
@comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
|
||||
@post = Post.new(title: 'New Post', body: 'Body')
|
||||
@post = Post.new(id: 'post', title: 'New Post', body: 'Body')
|
||||
@bio = Bio.new(id: 1, content: 'AMS Contributor')
|
||||
@author = Author.new(name: 'Joao M. D. Moura')
|
||||
@blog = Blog.new(id: 999, name: 'Custom blog', writer: @author, articles: [])
|
||||
@author = Author.new(id: 'author', name: 'Joao M. D. Moura')
|
||||
@blog = Blog.new(id: 999, name: 'Custom blog', writer: @author)
|
||||
@role = Role.new(name: 'Great Author')
|
||||
@location = Location.new(lat: '-23.550520', lng: '-46.633309')
|
||||
@place = Place.new(name: 'Amazing Place')
|
||||
@@ -325,12 +379,14 @@ module ActiveModelSerializers
|
||||
|
||||
def test_uses_file_digest_in_cache_key
|
||||
render_object_with_cache(@blog)
|
||||
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{::Model::FILE_DIGEST}"
|
||||
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
|
||||
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
|
||||
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
|
||||
end
|
||||
|
||||
def test_cache_digest_definition
|
||||
assert_equal(::Model::FILE_DIGEST, @post_serializer.class._cache_digest)
|
||||
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
|
||||
assert_equal(file_digest, @post_serializer.class._cache_digest)
|
||||
end
|
||||
|
||||
def test_object_cache_keys
|
||||
|
||||
19
test/fixtures/poro.rb
vendored
19
test/fixtures/poro.rb
vendored
@@ -1,10 +1,7 @@
|
||||
class Model < ActiveModelSerializers::Model
|
||||
FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
|
||||
rand(2).zero? && derive_attributes_from_names_and_fix_accessors
|
||||
|
||||
# Defaults to the downcased model name.
|
||||
def id
|
||||
@id ||= self.class.model_name.name.downcase
|
||||
end
|
||||
attr_writer :id
|
||||
|
||||
# At this time, just for organization of intent
|
||||
class_attribute :association_names
|
||||
@@ -23,6 +20,10 @@ class Model < ActiveModelSerializers::Model
|
||||
result[association_name] = public_send(association_name).freeze
|
||||
end.with_indifferent_access.freeze
|
||||
end
|
||||
|
||||
def attributes
|
||||
super.except(*association_names)
|
||||
end
|
||||
end
|
||||
|
||||
# see
|
||||
@@ -107,10 +108,6 @@ class PostPreviewSerializer < ActiveModel::Serializer
|
||||
has_many :comments, serializer: ::CommentPreviewSerializer
|
||||
belongs_to :author, serializer: ::AuthorPreviewSerializer
|
||||
end
|
||||
class PostWithTagsSerializer < ActiveModel::Serializer
|
||||
attributes :id
|
||||
has_many :tags
|
||||
end
|
||||
class PostWithCustomKeysSerializer < ActiveModel::Serializer
|
||||
attributes :id
|
||||
has_many :comments, key: :reviews
|
||||
@@ -207,10 +204,6 @@ module Spam
|
||||
end
|
||||
end
|
||||
|
||||
class Tag < Model
|
||||
attributes :name
|
||||
end
|
||||
|
||||
class VirtualValue < Model; end
|
||||
class VirtualValueSerializer < ActiveModel::Serializer
|
||||
attributes :id
|
||||
|
||||
@@ -2,13 +2,17 @@ require 'test_helper'
|
||||
module ActiveModel
|
||||
class Serializer
|
||||
class AssociationsTest < ActiveSupport::TestCase
|
||||
class ModelWithoutSerializer < ::Model
|
||||
attributes :id, :name
|
||||
end
|
||||
|
||||
def setup
|
||||
@author = Author.new(name: 'Steve K.')
|
||||
@author.bio = nil
|
||||
@author.roles = []
|
||||
@blog = Blog.new(name: 'AMS Blog')
|
||||
@post = Post.new(title: 'New Post', body: 'Body')
|
||||
@tag = Tag.new(id: 'tagid', name: '#hashtagged')
|
||||
@tag = ModelWithoutSerializer.new(id: 'tagid', name: '#hashtagged')
|
||||
@comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
|
||||
@post.comments = [@comment]
|
||||
@post.tags = [@tag]
|
||||
@@ -46,7 +50,11 @@ module ActiveModel
|
||||
end
|
||||
|
||||
def test_has_many_with_no_serializer
|
||||
PostWithTagsSerializer.new(@post).associations.each do |association|
|
||||
post_serializer_class = Class.new(ActiveModel::Serializer) do
|
||||
attributes :id
|
||||
has_many :tags
|
||||
end
|
||||
post_serializer_class.new(@post).associations.each do |association|
|
||||
key = association.key
|
||||
serializer = association.serializer
|
||||
options = association.options
|
||||
|
||||
Reference in New Issue
Block a user