Lors de l'utilisation de Rails ActiveModel :: Serializers Lorsque vous souhaitez rendre deux objets json, vous pouvez les imbriquer dans un seul ou non. Cet article est rédigé comme un mémorandum pour moi-même.
Lors de l'écriture du code suivant dans une méthode Rails, l'objet que vous souhaitez imbriquer Vous saurez jouer avec comme vous le souhaitez.
users_controller.rb
render json: { hoge: hoge, fuga: fuga }, include: :piyo
La solution est d'utiliser la méthode Rails''as_json`!
Ruby 2.6 Rails 6.0 active_model_serializers 0.10.10
Il existe les quatre modèles suivants.
l'utilisateur et l'installation sont 1: N, Le modèle de produit et le modèle utilisateur ne sont pas associés. Je n'ai pas besoin d'une colonne cette fois, je vais donc l'omettre.
user.rb
class User < ApplicationRecord
belongs_to :facility
end
facility.rb
class Facility < ApplicationRecord
has_many :users
end
product.rb
class Product < ApplicationRecord
#Aucune association
end
Lors de l'appel des utilisateurs # show action Vous devez rendre à la fois les objets utilisateur et produits, Vous devez également récupérer l'objet imbriqué pour l'utilisateur.
users_controller.rb
def show
user = User.find(params[:id])
products = Product.all
render json: { user: user, products: products }, include: ['facility']
end
Lorsque j'écris dans le code ci-dessus et que je reçois une réponse, j'obtiens l'erreur suivante!
NoMethodError (undefined method `facility' for #<Product:0x00007fed8d885518>):
Clarifié pour inclure dans l'objet json à rendre. Mais avec le style d'écriture ci-dessus La fonction est imbriquée à la fois dans l'objet utilisateur et dans l'objet produits. Étant donné que le modèle de produits et le modèle d'installation ne forment pas une association, Bien sûr, il n'y a pas de telle méthode (modèle?), Alors Rails dit, "facilité? Je ne connais pas une telle méthode!"
Utilisez la méthode as_json pour formater json au moment de l'affectation des variables, Spécifiez que le modèle d'installation doit être imbriqué avec include.
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
Cela vous permet d'imbriquer le modèle d'installation uniquement dans l'utilisateur variable.
Si vous dites: "Je n'ai pas besoin d'un modèle d'installation, je veux donc obtenir des données sans imbriquer le modèle d'installation!", Faites ceci.
users_controller.rb
def show
user = User.find(params[:id]).as_json
products = Product.all
render json: {user: user, products: products}, status: :ok
end
Je sais comment l'écrire, mais honnêtement, je ne sais pas pourquoi json est formaté sans être imbriqué. Y a-t-il des moments où il est imbriqué et des moments où il ne l'est pas? Vérification requise ici
Bonus: Les options as_json sont expliquées en détail dans l'article Liste des options ActiveModel as_json. Merci ~
Cliquez ici pour la documentation officielle de la méthode Rails as_json: https://railsdoc.com/page/as_json