Bei Verwendung von Rails ActiveModel :: Serializers Wenn Sie zwei JSON-Objekte rendern möchten, können Sie sie nur in einem verschachteln oder nicht. Dieser Artikel ist als Memorandum für mich geschrieben.
Wenn Sie den folgenden Code in eine Rails-Methode schreiben, das Objekt, das Sie verschachteln möchten Sie werden wissen, wie Sie damit spielen können, wie Sie möchten.
users_controller.rb
render json: { hoge: hoge, fuga: fuga }, include: :piyo
Die Lösung besteht darin, die Rails'as_json-Methode zu verwenden!
Ruby 2.6 Rails 6.0 active_model_serializers 0.10.10
Es gibt die folgenden vier Modelle.
Benutzer und Einrichtung sind 1: N, Das Produktmodell und das Benutzermodell sind nicht zugeordnet. Ich brauche diesmal keine Kolumne, also werde ich sie weglassen.
user.rb
class User < ApplicationRecord
belongs_to :facility
end
facility.rb
class Facility < ApplicationRecord
has_many :users
end
product.rb
class Product < ApplicationRecord
#Keine Assoziation
end
Beim Aufruf der Benutzer # show action Sie müssen sowohl das Benutzer- als auch das Produktobjekt rendern. Sie müssen auch das verschachtelte Objekt für den Benutzer abrufen.
users_controller.rb
def show
user = User.find(params[:id])
products = Product.all
render json: { user: user, products: products }, include: ['facility']
end
Wenn ich den obigen Code schreibe und eine Antwort erhalte, erhalte ich den folgenden Fehler!
NoMethodError (undefined method `facility' for #<Product:0x00007fed8d885518>):
Es wurde klargestellt, dass es in das zu rendernde JSON-Objekt aufgenommen werden soll. Aber mit dem obigen Schreibstil Die Einrichtung ist sowohl im Benutzerobjekt als auch im Produktobjekt verschachtelt. Da das Produktmodell und das Anlagenmodell keine Assoziation bilden, Natürlich gibt es keine solche Methode (Modell?) Rails sagt: "Einrichtung? Ich kenne eine solche Methode nicht!"
Verwenden Sie die as_json-Methode, um json zum Zeitpunkt der Zuweisung von Variablen zu formatieren. Geben Sie an, dass das Einrichtungsmodell mit include verschachtelt werden soll.
users_controller.rb
def show
user = User.find(params[:id]).as_json(include: 'facility')
products = Product.all
render json: {user: user, products: products}, status: :ok
end
Auf diese Weise können Sie das Einrichtungsmodell nur im variablen Benutzer verschachteln.
Wenn Sie sagen: "Ich benötige kein Einrichtungsmodell, möchte also Daten abrufen, ohne das Einrichtungsmodell zu verschachteln!", Führen Sie dies aus.
users_controller.rb
def show
user = User.find(params[:id]).as_json
products = Product.all
render json: {user: user, products: products}, status: :ok
end
Ich weiß, wie man es schreibt, aber ehrlich gesagt weiß ich nicht, warum json formatiert ist, ohne verschachtelt zu sein. Gibt es Zeiten, in denen es verschachtelt ist und Zeiten, in denen es nicht verschachtelt ist? Überprüfung hier erforderlich
Bonus: Die as_json-Optionen werden im Artikel ActiveModel as_json-Optionsliste ausführlich erläutert. Danke ~
Klicken Sie hier, um die offizielle Dokumentation der Rails as_json-Methode anzuzeigen: https://railsdoc.com/page/as_json