2015-07-17 1 views
2

Considérons le modèle show.json.jbuilder suivant:Y compris un autre modèle de JBuilder dans un autre

json.user do |json| 
    json.extract! @user, :id, :username, :email, :created_at, :avatar 
end 

json.policies do |json| 
    json.array!(@policies) do |policy| 
     json.extract! policy, :id, :title, :cached_votes_score 
    end 
end 

json.liked do |json| 
    json.array!(@liked) do |policy| 
     json.extract! policy, :id, :title, :cached_votes_score 
    end 
end 

json.disliked do |json| 
    json.array!(@disliked) do |policy| 
     json.extract! policy, :id, :title, :cached_votes_score 
    end 
end 

Serait-il possible de diviser ceux en quatre modèles différents, et inclure juste les dans le modèle show? Quelque chose comme:

include template_user 
include template_policies 
include template_liked 
include template_disliked 

Si cela est impossible, quelles alternatives existent pour la création d'un code de JBuilder plus modulaire? Je trouve mon code jbuilder très peu DRY.

Répondre

5

Oui. Est possible. Divisez vos fichiers comme:

_user.json.jbuilder

json.user do |json| json.extract! @user, :id, :username, :email, :created_at, :avatar end

_policies.json.jbuilder

json.policies do |json| json.array!(@policies) do |policy| json.extract! policy, :id, :title, :cached_votes_score end end

_liked.json.jbuilder

json.liked do |json| json.array!(@liked) do |policy| json.extract! policy, :id, :title, :cached_votes_score end end

_disliked.json.jbuilder

json.disliked do |json| json.array!(@disliked) do |policy| json.extract! policy, :id, :title, :cached_votes_score end end

et vous pouvez simplement les joindre à:

show.json.jbuilder

json.partial! 'user' json.partial! 'policies' json.partial! 'liked' json.partial! 'disliked'

Mais je suggère de les améliorer un peu et écrivez-les en utilisant des variables locales et ainsi:

_user.json.jbuilder

json.user do |json| json.extract! user, :id, :username, :email, :created_at, :avatar end

et vous incluez passer l'utilisateur comme argument:

json.partial! 'user', user: @user

+0

Cela tombe bien, et merci pour la note sur les variables locales! Une question de suivi: est-il possible d'inclure un partiel qui n'a pas de nom commençant par un trait de soulignement? – maxedison

+0

Non. Les partiels ont un trait de soulignement comme premier caractère, sinon ce sont des vues. – coorasse

+0

Oui, j'espérais pouvoir utiliser une vue comme vue dans certains cas, ou comme partielle dans d'autres. Je me rends compte que je peux le faire en appelant simplement «render template: ...» dans ma méthode de contrôleur sur le partiel, mais j'espérais pouvoir éviter cela. – maxedison