J'utilise un motif hideux dans mon code et je sais qu'il doit y avoir une meilleure façon de procéder. Aide-moi à repenser à ce que je fais.Passer des données entre les contrôleurs avec la session RESTfully
Mon site Web est une sorte de forum de discussion. Toutes les réponses aux discussions sont faites sur la page de discussion DiscussionsController #, inline.
Certaines réponses ne sont cependant pas valides. Par exemple, si vous tentez d'envoyer une réponse qui ne contient aucun texte, elle vous renvoie à DiscussionsController # show avec un message d'erreur.
Voici un bref aperçu de la façon dont je l'ai mis en œuvre ce flux de travail:
- utilisateur va montrer DiscussionsController de #. Ce modèle a un formulaire de réponse dessus. Il n'y a pas d'action # RepliesController explicite.
- L'utilisateur soumet un formulaire de réponse, qui est POSTé sur replies_path et géré dans RepliesController # create.
- RepliesController # create ne peut pas enregistrer la réponse car elle est invalide (validates_length_of in Reply invalide l'objet).
- RepliesController # create place l'objet réponse en session [: new_reply] et redirige vers le chemin de discussion d'où provient l'utilisateur.
- DiscussionsController # show gère l'objet de la session ...
comme ceci:
if session[:new_reply]
@new_reply = session[:new_reply]
session.delete(:new_reply)
end
Et maintenant show.html.erb a un objet @new_reply nouvellement régénéré pour inspecter les erreurs.
Il y a quelque chose qui ne va pas: vous ne devriez pas stocker des objets entiers à l'intérieur de la session. Mais puisque l'objet Reply que nous avons essayé d'enregistrer dans RepliesController # create n'est jamais sauvegardé, comment puis-je le conserver entre les appels d'action du contrôleur?
Ou s'il y a une solution de conception plus grande, n'hésitez pas à le partager. C'est tellement moche que ça me fait mal. Merci.
Je fais ce genre de choses de cette façon. Assurez-vous d'avoir @discussion et @reply chargés. – klew
J'ai pensé faire cela, mais il y a deux raisons pour lesquelles je n'aime pas l'approche de rendu: 1. Il change l'URL; Je voudrais garder l'illusion que vous êtes toujours sur la même page (parce que vous êtes). 2. Je n'aime vraiment pas le fait que je dois dupliquer la logique dans DiscussionsController # show - en m'assurant que les mêmes filtres sont appliqués, en m'assurant que @ discussion et d'autres variables d'instance sont choisies de la même manière avec des conditions, etc.) - ne semble pas très sec. – Raphomet