Domanda

Utilizzando Rails v2.1, supponiamo che tu abbia un'azione per un controller accessibile da più di una posizione. Ad esempio, all'interno dell'app Rails, hai un link per modificare un utente da due diverse viste, una nella vista indice degli utenti e un'altra da un'altra vista (diciamo dalla barra di navigazione su ogni pagina).

Mi chiedo quale sia il modo migliore per reindirizzare l'utente nel punto giusto a seconda del link su cui ha fatto clic. Ad esempio:

Esempio 1:

  1. Elenca tutti gli utenti
  2. Fai clic su " modifica " su un utente nell'elenco
  3. Clic dell'utente " salva " nel modulo, il controller reindirizza nuovamente a 1.

Esempio 2:

  1. L'utente potrebbe trovarsi su qualsiasi pagina all'interno dell'applicazione, la barra di navigazione mostra un collegamento per modificare l'utente corrente
  2. L'utente fa clic sul collegamento per modificarlo
  3. L'utente fa clic su " salva " nel modulo, il controller reindirizza alla pagina in cui si trovava quando l'utente ha fatto clic su " modifica " collegamento nella barra di navigazione.

L'ho visto fatto in passato da:

  1. Posizionamento di un parametro sul collegamento di modifica originale con il controller / azione originale in cui è apparso il collegamento. Per renderlo più ASCIUTTO, è possibile utilizzare @ controller.controller_name e @ controller.action_name in un helper.
  2. Il controller salva i parametri in una variabile di sessione.
  3. Dopo aver salvato il record, il controller reindirizza alla variabile di sessione.

Quello che non mi piace particolarmente di questa soluzione è la necessità di aggiungere il parametro a ogni collegamento applicabile nelle viste. Mi chiedo se c'è un modo per integrare tutto questo nel controller.

Un modo migliore a cui stavo pensando era:

  1. Posiziona un filtro pre-filtro su " modifica " azione per salvare il referrer (è abbastanza affidabile?) nella sessione.
  2. Quando " aggiorna " viene colpito, il controller reindirizzerà alla variabile di sessione e quindi eliminerà la variabile di sessione.

Qualche idea sul modo migliore per farlo?

È stato utile?

Soluzione

Penso che l'utilizzo di before_filter nell'azione di modifica sia il meno invadente.

Il referer dovrebbe essere abbastanza affidabile ... semplicemente avere un valore predefinito nel caso in cui nessun referer sia disponibile (diciamo: qualcuno ha aggiunto un segnalibro alla pagina di modifica) e dovresti stare bene.

Altri suggerimenti

Flash : i dati che utilizzerai solo per la richiesta successiva possono essere archiviati in Flash. Quindi non devi procedere a cancellarlo automaticamente. Funziona bene per bit limitati di contesto applicativo di cui avrai sicuramente bisogno solo una volta, non solo per messaggi di errore!

So cosa hai fatto l'ultimo accesso HTTP : se hai solo bisogno di reindirizzare le persone all'ultimo URL in cui si trovavano, allora fallo. request.referer fornirà, per la maggior parte dei browser che non bloccano le informazioni, l'ultimo URL in cui si trovava la persona.

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

Non suggerirei hardcoding quelli, per inciso.

before_filter : vedo molti sviluppatori di Rails che usano questo come il loro martello preferito e trasformano tutto il resto in chiodi. I filtri sono utili quando si desidera esporre funzionalità a tutti o sostanzialmente a tutti i metodi in un controller. Non so che sia necessariamente così, ma il tuo chilometraggio può variare. È possibile combinare il filtro con i due trucchi sopra indicati, se garantito.

Un altro approccio è caricare il modulo in un overlay, come http://flowplayer.org/ strumenti / overlay / index.html , quindi su ajax submit puoi chiudere l'overlay. Lo faccio in combinazione con un completamento automatico per offrire un "aggiungi nuovo" opzione. Una volta inviato il modulo di overlay, restituisco alcuni dati in json, che viene utilizzato per riempire il completamento automatico. (Ho creato il mio plugin per aiutare con tutto ciò)

Ci vuole un po 'più di lavoro, ma funziona davvero bene per l'utente finale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top