ActiveModel::Serializer Not Working
Solution 1:
This is not working because your controller isn't actually rendering out using the ActiveModel::Serializer
. You'd need to write it like this:
def nearby_from_category
@closest_clients = Client.from_category(params[:category]).
activated.locateable.all_with_translation(@lang).
by_distance(origin: remote_ip).limit(2)
render json: @closest_clients
end
In the event that you want to customize the serializer as indicated by the additional args on your to_json
call, you'd have to modify the ClientSerializer
that already exists to:
class ClientSerializer < ActiveModel::Serializer
attributes :id, :name, :path, :url
has_many :translations
has_many :pictures
def url
client_url(object)
end
def path
client_path(object)
end
end
class TranslationSerializer < ActiveModel::Serializer
attributes :name, :content
end
class PictureSerializer < ActiveModel::Serializer
attributes :image
end
Solution 2:
When using ActiveModel::Serializers (AMS) you should simply use:
render json: @post
The whole point of serializers is to move your json structure out of your controllers. So lets start out by getting rid of the include
hash in the render call:
def nearby_from_category
@closest_clients = Client.from_category(params[:category]).
activated.locateable.all_with_translation(@lang).
by_distance(origin: remote_ip).limit(2)
render json: @closest_clients
end
In most cases AMS can figure out which serializer to use for collections by itself by looking at the contents. You can specify it manually with the each_serializer
option.
To include the translations and pictures you would redefine your serializer:
class ClientSerializer < ActiveModel::Serializer
attributes :id, :name, :path, :url
has_many: :translations
has_many: :pictures
def url
client_url(object)
end
def path
client_path(object)
end
end
class TranslationSerializer < ActiveModel::Serializer
attributes :name, :content
end
class PictureSerializer < ActiveModel::Serializer
attributes :image
end
One big gotcha is that you may be creating a N + 1 query issue since the associations will be loaded separately for each client unless joined. This is not an AMS specific issue.
The many resulting SQL queries will slow down your server and can cause it to run out of memory. See the rails guides for potential solutions.
Post a Comment for "ActiveModel::Serializer Not Working"