How do I render an attribute only if some condition is true?
For example, I want to render User's token attribute on create action.
In the latest version (0.10.x
), you can also do it this way:
class EntitySerializer < ActiveModel::Serializer attributes :id, :created_at, :updated_at attribute :conditional_attr, if: :condition? def condition? #condition code goes here end end
For example:
class UserSerializer < ActiveModel::Serializer attributes :id, :username, :name, :email, :created_at, :updated_at attribute :auth_token, if: :auth_token? def created_at object.created_at.to_i end def updated_at object.updated_at.to_i end def auth_token? true if object.auth_token end end
This method does not work with latest version (0.10
)
With the version 0.8
it is even simpler. You don't have to use the if: :condition?
. Instead you can use the following convention to achieve the same result.
class EntitySerializer < ActiveModel::Serializer attributes :id, :created_at, :updated_at attribute :conditional_attr def include_conditional_attr? #condition code goes here end end
The example above would look like this.
class UserSerializer < ActiveModel::Serializer attributes :id, :username, :name, :email, :created_at, :updated_at attribute :auth_token def created_at object.created_at.to_i end def updated_at object.updated_at.to_i end def include_auth_token? true if object.auth_token end end
See 0.8 documentation for more details.
you can override the attributes
method, here is a simple example:
class Foo < ActiveModel::Serializer attributes :id def attributes(*args) hash = super hash[:last_name] = 'Bob' unless object.persisted? hash end end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With