-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Factor out ancestor class Field of Attribute and Reflection.
- Loading branch information
Showing
3 changed files
with
78 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,25 @@ | ||
require 'active_model/serializer/field' | ||
|
||
module ActiveModel | ||
class Serializer | ||
Attribute = Struct.new(:name, :options, :block) do | ||
def value(serializer) | ||
if block | ||
serializer.instance_eval(&block) | ||
else | ||
serializer.read_attribute_for_serialization(name) | ||
end | ||
end | ||
|
||
def included?(serializer) | ||
case condition | ||
when :if | ||
serializer.public_send(condition) | ||
when :unless | ||
!serializer.public_send(condition) | ||
else | ||
true | ||
end | ||
end | ||
|
||
private | ||
|
||
def condition_type | ||
if options.key?(:if) | ||
:if | ||
elsif options.key?(:unless) | ||
:unless | ||
else | ||
:none | ||
end | ||
end | ||
|
||
def condition | ||
options[condition_type] | ||
end | ||
# Holds all the meta-data about an attribute as it was specified in the | ||
# ActiveModel::Serializer class. | ||
# | ||
# @example | ||
# class PostSerializer < ActiveModel::Serializer | ||
# attribute :content | ||
# attribute :name, key: :title | ||
# attribute :email, key: :author_email, if: :user_logged_in? | ||
# attribute :preview do | ||
# truncate(object.content) | ||
# end | ||
# | ||
# def user_logged_in? | ||
# current_user.logged_in? | ||
# end | ||
# end | ||
# | ||
class Attribute < Field | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
module ActiveModel | ||
class Serializer | ||
# Holds all the meta-data about a field (i.e. attribute or association) as it was | ||
# specified in the ActiveModel::Serializer class. | ||
# Notice that the field block is evaluated in the context of the serializer. | ||
Field = Struct.new(:name, :options, :block) do | ||
# Compute the actual value of a field for a given serializer instance. | ||
# @param [Serializer] The serializer instance for which the value is computed. | ||
# @return [Object] value | ||
# | ||
# @api private | ||
# | ||
def value(serializer) | ||
if block | ||
serializer.instance_eval(&block) | ||
else | ||
serializer.read_attribute_for_serialization(name) | ||
end | ||
end | ||
|
||
# Decide whether the field should be serialized by the given serializer instance. | ||
# @param [Serializer] The serializer instance | ||
# @return [Bool] | ||
# | ||
# @api private | ||
# | ||
def included?(serializer) | ||
case condition | ||
when :if | ||
serializer.public_send(condition) | ||
when :unless | ||
!serializer.public_send(condition) | ||
else | ||
true | ||
end | ||
end | ||
|
||
private | ||
|
||
def condition_type | ||
if options.key?(:if) | ||
:if | ||
elsif options.key?(:unless) | ||
:unless | ||
else | ||
:none | ||
end | ||
end | ||
|
||
def condition | ||
options[condition_type] | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters