Domanda

Ho una visione per un controller chiamato "show". All'interno di quella vista, voglio rendere i contenuti di vista di un altro controller - e, ovviamente, la logica per il modulo a quella vista per parlare con il controller appartiene troppo. Come faccio a fare questo? Sono abbastanza nuovo alle rotaie e io non sono sicuro al 100% con ancora il quadro.

Si potrebbe quasi considerare li "widget" per la vista. So che si può rendere le azioni dalla stessa controller sulla vista utilizzando:

render :action => "show_home_page", :layout=> false

, ma ho bisogno di rendere l'azione (vista) da un altro controllore.

es.

  

Ho una visione, che è   resi in un formato. Questo punto di vista,   appartiene al controller A.   Ho bisogno di rendere l ' "Indice" e "nuovo"   viste dal controllore B all'interno della vista originale (sopra)

.

È stato utile?

Soluzione

La terminologia in questione è un po 'confuso. Se siete in un controller e si desidera eseguire il codice in un altro metodo di azione in un altro controller e rendere la sua mascherina, si dovrebbe redirect_to quell'azione. Diciamo che l'altro controller si chiama ContractsController

redirect_to :controller => "contracts", :action => "show_home_page"

Se si desidera utilizzare il modello di vista da un altro metodo come la risposta dalla tua azione, è sufficiente anteporre il nome del controller nel parametro rendering. Questo non chiamerà l'azione, sarà solo usare il suo modello.

Ad esempio, se il modello vive nella cartella per il controller contratti.

render :action => "/contracts/show_home_page", :layout=> false

Credo che in questo caso in realtà si sta parlando di un parziale, che sarebbe simile

render :partial => "/contracts/show_home_page"

Tuttavia, che cosa ti vedo afferrare a qui è che in realtà si vuole chiamare più metodi d'azione per eseguire il rendering di una singola pagina. Questo non è come funziona. Si sta andando ad avere per configurare gli oggetti che i modelli farà riferimento a una singola azione. Questa è una ragione maggior parte degli sviluppatori Rails messo un sacco di codice nei modelli, in modo che il programma di installazione non viene ripetuto su tutti i controllori.

Ma c'è un altro modo ... , dove la magia del JavaScript entra in gioco.

Nella pagina, creare una funzione come questa:

<script type="text/javascript" language="javascript">    
function load_categories() {
            <%= remote_function(:url => {:controller => "categories", :action => "list"},
                                  :update => "categories")%>
        };
</script>

Se si chiama che nel onload anche della vostra pagina, sostituirà il div con ID "categorie" con la risposta dall'azione di riferimento.

Altri suggerimenti

Se davvero si vuole rendere del tutto un'altra azione (cioè la simulazione di una richiesta di passare attraverso l'intero stack di Ruby on Rails), è possibile utilizzare Webrat (controllare Webrat screencast qui).

In tradizionali applicazioni web MVC, si dovrebbe raramente hanno la necessità di fare questo. Ma nella mia esperienza nello sviluppo di Sofea stile e micro-architettura webapps , questo sta diventando sempre più comune.

Non sono sicuro di aver capito la sua dichiarazione problema completamente (il motivo per cui questo deve essere fatto dal punto di vista), ma direi che basta chiamare redirect_to dal regolatore al regolatore A B.

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