2016-07-20 5 views
0

Ich arbeite an einem Back-End einer Anwendung in Sinatra geschrieben. Es hat eine Route "/ Benachrichtigungen"wie benutzerdefinierte Serializer in Sinatra-Anwendung aufrufen

, die alle Benachrichtigungen in JSON rendert. Ich möchte die JSON-Struktur ändern und schrieb einige benutzerdefinierte Serializer und es ist jetzt fehlgeschlagen. der Fehler i erhalten ist

"{"message":"undefined method `read_attribute_for_serialization' for nil:NilClass"}" 

Ich habe eine Datei mit dem Namen webservice/notification.rb , die eine Benachrichtigung Serializer auswählt. der Code ist so etwas wie dieses

serializer = NotificationSerializer 
json serialize(notifications, root: :notifications, each_serializer: serializer) 

Die NotificationSerializer ist so etwas wie dieses.

class NotificationSerializer < Serializer 
    attributes :id, :tag, :event, :time, :read 

    has_one :reference, polymorphic: true, include: true 

Die Referenz hier kann eine Menge Dinge sein.

das Benachrichtigungsmodell definiert Referenz als

def reference 
company || contact || deal || invitation || meeting || todo || reference_email || reference_user || 
contact_import_job 
    end 

jetzt alle diese Modelle in Bezug haben es Serializer im Verzeichnis implementiert Serializer/* Ich möchte benutzerdefinierte Serializer für alle diese machen, die nur begrenzte Informationen übertragen werden. Wie kann ich meinen eigenen Serializer für Dinge innerhalb der Referenz aufrufen.

Ich schrieb einen benutzerdefinierten Serializer für Benachrichtigungen und nannte es so in meiner Referenzfunktion und es funktionierte.

...|| UserNotificationSerializer.new(reference_user) || ... 

aber wenn ich das gleiche für meine anderen Modelle mache, bekomme ich den oben angegebenen Fehler. was wäre der richtige Weg, um meine benutzerdefinierten Serialisierer aufzurufen.

Antwort

0

Ein guter Weg, es zu tun, ist eine Instanz-Methode auf dem Modell zu schreiben:

class Notification < ActiveRecord::Base 
    def public_attributes # or call it whatever 
    attributes_hash = attributes 
    # in activerecord, the attributes method turns a model instance into a hash 
    # do some modifications to the hash here 
    return attributes_hash 
    end 
end 

dann sagen Sie json in einem Controller Rückkehr:

get '/some_route' do 
    @notifications = Notification.all # or whatever 
    serialized_notifications = @notifications.map(&:public_attributes) 
    # For a single record, you could do @notification.public_attributes 
    json_data = serialized_notifications.to_json # a serialized array of hashes 
    content_type :json 
    return json_data 
end 
Verwandte Themen