2009-03-21 7 views
5

Sto provando a passare un attributo di modello a una vista, dopo averlo impostato con successo su un nuovo valore dall'interno di un'azione nel mio controller. Ma questa variabile è sempre nul dal momento in cui arriva alla vista, quindi non posso usarla per visualizzare condizionatamente delle cose. Dovrei aggiungere che questo attributo non è un campo nel database. Cosa mi sfugge/sto sbagliando?Passaggio di un attributo di modello a una vista di Rails utilizzando redirect_to

Ecco il codice nel mio modello:

attr_accessor :mode 

#getter 
def mode 
@mode 
end 

#setter 
def mode=(val) 
@mode = val 
end 

... nel controller:

@report.mode = "t" 
redirect_to edit_report_path(@report) 

... e, a mio avviso:

<%= build_report(@report.mode) %> 

.. .ma questo metodo di aiuto non ottiene mai la variabile che ho appena impostato nel controller. È zero. Cosa dà? Chiaramente mi manca qualcosa di base qui perché sembra che dovrebbe essere semplice. Qualsiasi intuizione sarebbe molto apprezzata. Grazie.

risposta

3

edit_report_path genera un URL con l'ID di @report in esso.

redirect_to essenzialmente crea una richiesta completamente nuova e va a quell'URL. Quando arriva a edit, tutto ciò che ha è l'ID. Di solito va bene - cerca l'oggetto e continua, ma ovviamente non avrà il campo non-db impostato.

Ci sono un paio di modi per risolvere questo problema. Puoi usare: render invece per arrivare alla pagina di modifica - quindi @report avrà il campo impostato.

@report.mode = "t" 
render :action => edit and return 

In alternativa, è possibile effettuare mode un campo di database.

+0

Questo è quello che ho usato: render (: action => 'edit',: object => @report) e restituire Grazie a tutti voi ... – echobase

0

Il problema è redirect_to; stai restituendo una risposta al client che lo fa ripetere la richiesta con un URL diverso. In questa seconda richiesta la modalità non è impostata perché non è stata salvata prima di completare la prima richiesta.

2

Il problema è nello redirect_to. Quando si reindirizza da qualche altra parte tutte le variabili di istanza vengono perse. Quindi quando imposti @report.mode = "t" imposta l'attributo. Ma quando si reindirizza, i dati vengono persi.

Suppongo che lo <%= build_report(@report.mode) %> sia in edit_report.html.erb e che il codice da quando si imposta 'mode' non sia nell'azione di modifica. Se questo è il caso si può essere in grado di passare il report.mode all'azione di modifica nella url in questo modo:

build_report(@report.mode, :mode => "t") 
Problemi correlati