Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditional attributes in Active Model Serializers

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.

like image 874
Dan Avatar asked Apr 17 '15 17:04

Dan


2 Answers

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 

EDIT (Suggested by Joe Essey) :

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.

like image 189
Abdelhakim AKODADI Avatar answered Oct 05 '22 07:10

Abdelhakim AKODADI


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 
like image 45
apneadiving Avatar answered Oct 05 '22 05:10

apneadiving