mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
If you try to render Enumerable with custom `each_serializer` then it will render with default serializer instead: ```ruby render json: sequel_scope, each_serializer: CustomSerializer ``` This commit fixes this behaviour. Most likely fixes https://github.com/rails-api/active_model_serializers/issues/664 as well
149 lines
2.5 KiB
Ruby
149 lines
2.5 KiB
Ruby
class Model
|
|
def initialize(hash={})
|
|
@attributes = hash
|
|
end
|
|
|
|
def read_attribute_for_serialization(name)
|
|
if name == :id || name == 'id'
|
|
object_id
|
|
else
|
|
@attributes[name]
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
###
|
|
## Models
|
|
###
|
|
class User < Model
|
|
def profile
|
|
@profile ||= Profile.new(name: 'N1', description: 'D1')
|
|
end
|
|
end
|
|
|
|
class UserInfo < Model
|
|
def user
|
|
@user ||= User.new(name: 'N1', email: 'E1')
|
|
end
|
|
end
|
|
|
|
class Profile < Model
|
|
end
|
|
|
|
class Category < Model
|
|
def posts
|
|
@posts ||= [Post.new(title: 'T1', body: 'B1'),
|
|
Post.new(title: 'T2', body: 'B2')]
|
|
end
|
|
end
|
|
|
|
class Post < Model
|
|
def comments
|
|
@comments ||= [Comment.new(content: 'C1'),
|
|
Comment.new(content: 'C2')]
|
|
end
|
|
end
|
|
|
|
class Comment < Model
|
|
end
|
|
|
|
class WebLog < Model
|
|
end
|
|
|
|
class Interview < Model
|
|
def attachment
|
|
@attachment ||= Image.new(url: 'U1')
|
|
end
|
|
end
|
|
|
|
class Mail < Model
|
|
def attachments
|
|
@attachments ||= [Image.new(url: 'U1'),
|
|
Video.new(html: 'H1')]
|
|
end
|
|
end
|
|
|
|
class Image < Model
|
|
end
|
|
|
|
class Video < Model
|
|
end
|
|
|
|
###
|
|
## Serializers
|
|
###
|
|
class UserSerializer < ActiveModel::Serializer
|
|
attributes :name, :email
|
|
|
|
has_one :profile
|
|
end
|
|
|
|
class UserInfoSerializer < ActiveModel::Serializer
|
|
has_one :user
|
|
end
|
|
|
|
class ProfileSerializer < ActiveModel::Serializer
|
|
def description
|
|
description = object.read_attribute_for_serialization(:description)
|
|
scope ? "#{description} - #{scope}" : description
|
|
end
|
|
|
|
attributes :name, :description
|
|
end
|
|
|
|
class DifferentProfileSerializer < ActiveModel::Serializer
|
|
attributes :name
|
|
end
|
|
|
|
class CategorySerializer < ActiveModel::Serializer
|
|
attributes :name
|
|
|
|
has_many :posts
|
|
end
|
|
|
|
class PostSerializer < ActiveModel::Serializer
|
|
attributes :title, :body
|
|
|
|
has_many :comments
|
|
end
|
|
|
|
class CommentSerializer < ActiveModel::Serializer
|
|
attributes :content
|
|
end
|
|
|
|
class WebLogSerializer < ActiveModel::Serializer
|
|
attributes :name, :display_name
|
|
end
|
|
|
|
class WebLogLowerCamelSerializer < WebLogSerializer
|
|
format_keys :lower_camel
|
|
end
|
|
|
|
class InterviewSerializer < ActiveModel::Serializer
|
|
attributes :text
|
|
|
|
has_one :attachment, polymorphic: true
|
|
end
|
|
|
|
class MailSerializer < ActiveModel::Serializer
|
|
attributes :body
|
|
|
|
has_many :attachments, polymorphic: true
|
|
end
|
|
|
|
class ImageSerializer < ActiveModel::Serializer
|
|
attributes :url
|
|
end
|
|
|
|
class VideoSerializer < ActiveModel::Serializer
|
|
attributes :html
|
|
end
|
|
|
|
class ShortProfileSerializer < ::ProfileSerializer; end
|
|
|
|
module TestNamespace
|
|
class ProfileSerializer < ::ProfileSerializer; end
|
|
class UserSerializer < ::UserSerializer; end
|
|
end
|