Je développe un site Web Rails 2.3.1. Tout au long du site Web, j'ai besoin d'un formulaire pour créer des messages sur différentes pages (page d'accueil, page de création de messages, page de publication, page de liste de commentaires, etc.). une variété de contrôleurs). Chacune de ces pages affiche une grande variété d'autres informations qui sont récupérées dans le contrôleur/action correspondant. Ex, la page d'accueil liste les 10 derniers messages, le contenu extrait de la base de données, etc.Rails meilleure pratique pour avoir la même forme sur plusieurs pages
J'ai donc déplacé le formulaire de création de message dans sa propre partie, et j'ai inclus ce partiel sur toutes les pages nécessaires. Notez que le formulaire dans les POST partiels à/questions (qui route vers PostsController :: create - c'est le comportement des rails par défaut). Le problème que je rencontre est lorsque le formulaire Posts n'est pas complété correctement, par défaut la méthode PostsController :: create rend les questions/new.html.erb, même si le formulaire a été soumis à partir de la page d'accueil (/ home/index.html.erb).
J'ai essayé de changer le formulaire dans le partiel pour envoyer le "submitting_controller" et "submitting_action", et dans PostsController :: create, quand @ post.save? == false, je rends l'action => "../submitting_controller/submitting_action" (Ce qui est légèrement hacky, mais permet de rendre des actions de non-PostsController).
Cela a semblé fonctionner correctement sur la surface. Le formulaire incomplet a été rendu dans la vue qui l'a envoyé avec tout le bon message @ post.errors, etc. Le problème était que TOUTES les autres données sur les pages ne s'affichaient pas, parce que les méthodes réelles submitting_controller/submitting_action n'étaient pas appelées, juste la vue associée. (Rappelez-vous, j'ai fait un rendu qui préserve les objets d'instance, plutôt qu'un redirect_to qui ne conserve pas l'objet instance @post qui a tous les messages d'erreur et les valeurs soumises.)
Pour autant que je peux voir, j'ai deux options :
1) Je peux stocker l'objet @post dans la session lorsque @ post.save? échoue dans PostsController :: create, redirect_to submitting_controller/submitting_action, à quel point je retire l'objet @post de la session et l'utilise pour re-remplir les messages formulaire/erreur. (Pour autant que je sache, stocker des objets dans la session est pratique BAD dans les rails)
2) Je peux déplacer toute la logique utilisée pour extraire des données de formulaire de création non-post à partir des divers submitting_controller/submitting_action, le mettre dans le ApplicationController, créez une instruction switch géante dans PostsController :: create pour submitting_controller/submitting_action et appelez les méthodes dans ApplicationController pour récupérer toutes les données supplémentaires nécessaires au rendu de chaque page soumise. Réflexions sur la meilleure façon de faire cela dans Rails?
Emfi, Bon point sur les attributs imbriqués. Cela ne m'est pas venu à l'esprit. Le point que vous faites sur la non-JS est important. Le sentiment que j'ai eu est que le questionneur (faute d'une meilleure poignée :) finira par nuire aux performances de l'application à travers la quantité d'action DB qu'il/elle devra effectuer pour reconstituer tous les objets. – robertpostill
Sur ce, nous sommes d'accord. Cependant, la différence entre un non-javascript et un AJAX est généralement un appel link_to_remote, un RJS qui rend un template, et peut-être une petite logique de contrôleur pour éviter les appels de base de données que vous feriez normalement sinon. – EmFi
EmFi, Malheureusement, le modèle Post et les modèles dont vous allez utiliser le contrôleur pour rendre le formulaire ne sont peut-être pas liés. (HomeController n'a même pas de modèle de support). Je fais quelques vérifications sur un mécanisme captcha dans PostController :: create (le champ captcha ne fait pas partie du Post Model, mais plutôt son propre module). Je pense que vous et Robertpostill avez raison dans AJAX est le moyen de résoudre ce problème.Je dois juste comprendre comment le faire avec jQuery (j'ai choisi de ne pas utiliser Prototype, pref personnel) et ne pas muck quoi que ce soit dans Rails. – empire29