Sto sviluppando un sito Web Rails 2.3.1. In tutto il sito Web, ho bisogno di un modulo per la creazione di post su varie pagine (pagina iniziale, pagina Crea post, pagina di annuncio, pagina di elenco commenti, ecc. - basti dire che questo modulo deve trovarsi su molte pagine servite da una varietà di controller). Ciascuna di queste pagine visualizza un'ampia varietà di altre informazioni che vengono recuperate nel controller/azione corrispondente. Ex, la home page elenca gli ultimi 10 post, i contenuti estratti dal DB, ecc.Le migliori pratiche di Rails per avere lo stesso modulo su più pagine
Quindi, ho spostato il modulo di creazione del post in un suo partial e incluso questo parziale in tutte le pagine necessarie. Si noti che il modulo nei POST a/domande (che si dirige verso PostsController :: create - questo è il comportamento delle guide di default).
Il problema che sto incontrando è quando il modulo Post non è completato correttamente, per impostazione predefinita il PostsController :: crea il metodo di rendering questions/new.html.erb, anche se il modulo è stato inviato dalla home page (/ home/index.html.erb).
Ho provato a modificare il modulo nel parziale per inviare "submitting_controller" e "submitting_action", e in PostsController :: create, when @ post.save? == false, I render action => "../submitting_controller/submitting_action" (Che è leggermente hacky, ma ti permette di renderizzare le azioni da quelle di PostsController).
Questo sembrava funzionare correttamente in superficie. Il modulo incompleto è stato reso nella vista che lo ha inviato con tutto il messaggio @ post.errors corretto, ecc. Il problema era che TUTTI gli altri dati sulle pagine non si presentavano, perché i metodi effettivi submitting_controller/submitting_action non venivano chiamati, solo la vista associata. (Rieber, ho fatto un rendering che conserva gli oggetti di istanza, piuttosto che un redirect_to cui non conserva l'oggetto istanza @post che ha tutti i messaggi di errore e i valori inviati.)
Per quanto posso vedere ho due opzioni :
1) Posso archiviare l'oggetto @post nella sessione quando @ post.save? fallisce in PostsController :: create, redirect_to submitting_controller/submitting_action, a quel punto estraggo l'oggetto @post dalla sessione e lo uso per ri-popolare i messaggi di tipo/errore. (Per quanto ho capito, la memorizzazione degli oggetti nella sessione è pratica CATTIVA nei binari)
2) Posso spostare tutta la logica utilizzata per estrarre i dati del modulo di creazione non post dai vari submitting_controller/submitting_action, inserirli nel ApplicationController, crea una gigantesca istruzione switch in PostsController :: create per submitting_controller/submitting_action e chiama i metodi in ApplicationController per raccogliere tutti i dati extra necessari per ogni rendering della pagina di invio.
Pensieri sul modo migliore per farlo all'interno di Rails?
Emfi, Bel punto sugli attributi nidificati. Non mi era venuto in mente. Inoltre, il punto che si definisce in merito all'impostazione predefinita per non-JS è importante. Il sentimento che ho ottenuto è che l'interrogante (per mancanza di un handle migliore :) finirà per danneggiare le prestazioni dell'applicazione attraverso la quantità di azione DB che lui/lei avrebbe bisogno di eseguire ricostituendo tutti gli oggetti. – robertpostill
Su questo siamo d'accordo. Tuttavia, la differenza tra non javascript e AJAX è solitamente una chiamata a link_to_remote, un RJS che rende un modello e probabilmente una piccola logica di controller per evitare le chiamate al database che normalmente si farebbero diversamente. – EmFi
EmFi, Sfortunatamente il modello Post e i modelli di controller che utilizzerai per rendere il modulo potrebbero non essere correlati. (HomeController non ha nemmeno un modello di supporto). Faccio qualche controllo su un meccanismo captcha nel PostController :: create (il campo captcha non fa parte del Post Model, ma piuttosto un suo modulo). Penso che sia tu che Robertpostill abbiate ragione in AJAX sia il modo di affrontare questo problema.Devo solo capire come farlo con jQuery (ho deciso di non usare Prototype, pref personale) e non muckare nulla in Rails. – empire29