[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