2009-09-05 15 views
5

ich eine einfache Form wie dieses:Rails einfache Form gibt InvalidAuthenticityToken Fehler

<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> 

und einen Controller mit dieser Methode:

def busca 
    puts params[:searchText] 
    end 

Wenn ich einen Klick auf die Schaltfläche Bild in Form Ich bekomme einen ActionController :: InvalidAuthenticityToken. Hier ist die vollständige Stacktrace:

/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 Senden‘ /Library/Rubin/Edelsteine /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 rufen Sie ' /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 senden' /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 Prozess ' /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 require ' /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 require' /Library /Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49

Was passiert?

Antwort

7

Standardmäßig werden alle nicht-GET Aktionen erfordert die Echtheit Token zu sein zusammen mit der Anfrage weitergegeben. Rails verwendet den Authentizitätstoken, um CSRF-Angriffe zu vermeiden.

Der einfachste Weg, um sicherzustellen, dass es immer an seinem Platz ist, ist die Verwendung des form_tag Helfers, anstatt den HTML-Code von Hand zu schreiben.

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

Da ist es sicher. Ich stehe korrigiert! :) –

0

protect_from_forgery: Nur => [: Erstellen: update,: zerstören] Sie werden einige Mühe sparen :) (in Ihre Controller-Klasse)

+0

Es hat nicht funktioniert. Ich habe festgestellt, dass der Fehler nicht mehr angezeigt wird, wenn ich "method = post" entferne. –

5

Wenn Sie Ihr Formular-Tags erzeugen keine Helfer verwenden, das ist, wie Sie manuell das versteckte Feld mit der Authentizität Token erzeugen:

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

Nach dem Vorbild der Nat, das Hinzufügen

<%= token_tag %> 

kurz nach dem HTML "Form" Tag

+0

Danke! Dies sollte der akzeptierten Antwort hinzugefügt werden. – karlingen

+0

<=% token_tag nil%> sollte verwendet werden – Kush

1

ein Formular Helfer arbeitet Verwendung als andere vorschlagen haben ed oben funktioniert.

Da dies jedoch ein Suchformular ist, sollte die Methode eigentlich 'get' sein. Im Allgemeinen sollten Sie ein 'get' verwenden, es sei denn, etwas in der Datenbank wird sich ändern.

Mit method = 'get' für Suchformulare ist mehr Lesezeichen/Zurück-Taste freundlich.

Verwandte Themen