[ruby-it] Disabilitare funzione "aggiorna" del browser

Andrea Campi andrea.campi a zephirworks.com
Mer 11 Mar 2009 08:34:16 CET


On 3/10/09 5:17 PM, Sam Pei wrote:
> Andrea Campi wrote:
> -cut-
>    
>> Ma nel redirect puoi sempre mandare l'id del record inserito e
>> rileggerlo dal FB; oppure usare la sessione; o un flash (che � sempre la
>> sessione)...
>>      
>
> Grazie!
> Alla fine ho fatto così.
> Invece di fare il render di un partial dove mostravo i dati del record
> appena creato ho fatto il redirect a un'altra azione passandogli l'id
> del record creato. L'id l'ho messo in session perchè se uso params
> ancora una volta l'utente lo puo' cambiare dalla barra dell'indirizzo.
> L'unica cosa che non mi piace è fare un accesso al DB che potevo
> evitare, ma penso non ci sia altra soluzione.
>    
Ottimo. Evitare l'accesso al DB sarebbe un'ottima cosa, ma a meno che la 
tua applicazione sia ad alto volume, non me ne preoccuperei troppo.
Vale sempre la regola d'ora: prima fallo funzionare bene, dopo pensa ad 
ottimizzare ;)
>> Oppure puoi usare protect_from_forgery e gestire l'exception
>> ActionController::InvalidAuthenticityToken che ti arriva al reload.
>> Controlla la documentazione, � abbastanza chiara.
>>      
>
> Questo invece non l'ho capito.
> Allora, nel controller ho messo:
>
> protect_from_forgery :secret =>  'segreta'
>
> e nella view:
>
> <%= javascript_tag "window._token = '#{form_authenticity_token}'" %>
>
> Alla fine pero' tutto funziona come a prima. Se faccio il reload dal
> browser mi aggiunge un altro record e non mi arriva nessuna exception.
>
> Tanto per capire, perchè ormai ho risolto nell'altro modo.
>    
Non riesco a farti ora un esempio concreto, ma se crei una action 
semplice non Ajax, con una form creata con form_for (e con 
protect_from_forgery nel controller) dovresti vedere questo comportamento:
  - nella form viene inserito un campo hidden con un token casuale
  - al submit della form, il controller verifica che quel token non sia 
già stato creato (dovresti vederti il token tra i parametri in 
development.log)
  - poi tu mostri il risultato della form; se l'utente fa reload, 
vengono rimandati gli stessi dati, incluso lo stesso token; il server ti 
tira una exception.

Non so perché tu non veda questa exception; di certo settare il token 
via javascript non basta, la documentazione fornisce quell'esempio per 
farti vedere come gestire questa cosa se ti crei del javascript a mano, 
ma per un uso normale basta form_for / form_tag. Giocaci un po' se hai 
tempo e vuoi capire.

Naturalmente poi hai il problema di gestire l'exception, ad esempio con 
rescue_action_in_public.

Ciao,
     Andrea


More information about the Ml mailing list