2010-12-06 40 views
1

Comment puis-je m'assurer qu'un parent ne construit ses enfants que n fois dans Rails?Comment construire les enfants d'un parent seulement une fois dans les rails

Existe-t-il un moyen de trouver des instances non-persistées?

Je rencontre actuellement un problème lorsque je crée les enfants sur le premier chargement d'une page. Lorsqu'un utilisateur actualise la page, les enfants ne sont pas chargés car ils ont déjà été créés, mais n'ont pas été persistés.

Des idées sur la façon de résoudre ce problème?

De l'avis:

if (session[:members_built] == false) 
    @membership.build_members 
    session[:members_built] = true 
end 

... 

    <% f.fields_for :members do |ff| %> 
<%= render :partial => "member", :locals => { :ff => ff } %> 

Dans le modèle:

def build_members 
    (membership_type.adults - 1).times {members.build} 
    end 
+2

Montrez du code. –

+0

code ajouté, si j'ai manqué quelque chose d'autre s'il vous plaît faites le moi savoir – amaseuk

+0

S'il vous plaît nous montrer votre contrôleur. – monocle

Répondre

1
if (session[:members_built] == false) 
    @membership.build_members 
    session[:members_built] = true 
end 

Je recommande de ne pas avoir de code comme ceci est votre point de vue. Cela va à l'encontre des principes MVC. Alors déplacez-le dans le contrôleur. Consultez également le Rails Guides for associations.

Ainsi, vous pouvez faire quelque chose comme

@membership.build_members 

dans votre contrôleur. Vous n'avez pas besoin d'utiliser une variable de session pour vous souvenir si vous avez appelé #build_members car l'utilisation de #build ne sauvegarde pas l'objet. Ainsi, quand un utilisateur actualise la page, le contrôleur appelle à nouveau #build_members et votre vue devrait être ce que vous voulez.

+1

Le problème avec ceci est qu'il peut en résulter des membres en double, si par exemple, le formulaire est soumis avec des erreurs et est rechargé ...! – amaseuk

+0

Si elles ne sont pas numérotées, elles n'existent pas au-delà du cycle de requête existant et, par conséquent, ne sont pas dupliquées ... – karmajunkie

+1

La raison pour laquelle j'ai utilisé la session est d'empêcher les enfants de se construire trop souvent. J'ai rencontré ce problème, car lorsque le formulaire soumet une erreur, il stocke les valeurs de formulaire dans la session. Le résultat est des doublons. Des idées pour contourner ce problème? Ignorerait @ membership.build_members if! Params [: membership] .empty? faire l'affaire? – amaseuk