2009-09-05 17 views
5

Ho una forma semplice come questo:Rails forma semplice dà errore InvalidAuthenticityToken

<form name="serachForm" method="post" action="/home/search"> 
    <input type="text" name="searchText" size="15" value=""> 
    <input class="image" name="searchsubmit" value="Busca" src="/images/btn_go_search.gif" align="top" border="0" height="17" type="image" width="29"> 
</form> 

e un controller con questo metodo:

def busca 
    puts params[:searchText] 
    end 

Quando faccio un clic sul pulsante immagine in forma Ottengo un ActionController :: InvalidAuthenticityToken. ecco la StackTrace completo:

/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/request_forgery_protection.rb:86:in verify_authenticity_token' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in Inviare' /Library/Rubino/Gems /1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in evaluate_method' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:166:in chiamata' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters. RB: 225: in call' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:629:in run_before_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:615:in call_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:610:in perform_action_without_benchmark' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2 /lib/action_controller/rescue.rb:136:in perform_action_without_caching' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:13:in perform_action' /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in cache' /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/query_cache.rb:8:in cache ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:12:in perform_action' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:524:in inviare' /Library/Ruby/Gems/1.8/gems/actionpack -2.2.2/lib/action_controller/base.rb: 524: in process_without_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:606:in process_without_session_management_support ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/session_management.rb:134:in process' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:392:in process ' /Library/Ruby/Gems/1.8/gems/rails-2.2.2 /lib/webrick_server.rb:74:in service' /Library/Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/servers/webrick.rb:66 /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in richiedono ' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in new_constants_in' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in richiedono' /Library /Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49

Cosa sta succedendo?

risposta

7

Per impostazione predefinita, tutte le azioni non-get richiede il token di autenticità di essere passato con la richiesta. Rails utilizza il token di autenticità per evitare attacchi CSRF.

Il modo più semplice per assicurarsi che sia sempre presente, consiste nell'utilizzare l'helper form_tag invece di scrivere l'HTML a mano.

<% form_tag "/home/search", :name => "searchForm" do %> 
    fields here 
<% end %> 
+0

Ci sono sicuro. Sono corretto! :) –

0

protect_from_forgery: solo => [: creare,: aggiornamento,: distruggere] vi farà risparmiare qualche problema :) (nella classe Controller)

+0

Non ha funzionato. Ho notato che quando rimuovo il "metodo = post" l'errore non viene più visualizzato. –

5

Se non si utilizza aiutanti per generare i tag di modulo, questo è il modo di generare manualmente il campo nascosto con il token di autenticità:

<input type="hidden" 
     value="<%= form_authenticity_token() %>" 
     name="authenticity_token"/> 
20

Lungo le linee di Nat, aggiungendo

<%= token_tag %> 

subito dopo il tag HTML "forma" funziona

+0

Grazie! Questo dovrebbe essere aggiunto alla risposta accettata. – karlingen

+0

<=% token_tag nil%> deve essere utilizzato – Kush

1

Utilizzando una forma di supporto come altri hanno suggerire sopra funzionerà.

Poiché questo è un modulo di ricerca, il metodo dovrebbe in realtà essere "get". In generale, dovresti usare un 'get' a meno che qualcosa nel database non cambierà.

L'utilizzo di method = 'get' per i moduli di ricerca è più adatto ai preferiti/ai pulsanti indietro.

Problemi correlati