2009-09-05 6 views
5

J'ai une forme simple comme ceci:Rails donne erreur 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> 

et un contrôleur avec cette méthode:

def busca 
    puts params[:searchText] 
    end 

Quand je fais un clic sur le bouton d'image sous la forme Je reçois un ActionController :: InvalidAuthenticityToken. voici la pleine 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 Envoyer » /Library/Ruby/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 appelez ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters. rb: 225: dans call' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:629:in run_before_filters de call_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:610:in /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:615: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 envoyer' /Library/Ruby/Gems/1.8/gems/actionpack -2.2.2/lib/action_controller/base.rb: 524: dans 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 processus ' /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' /Bibliothèque /Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49

Que se passe-t-il?

Répondre

7

Par défaut, toutes les actions non-GET nécessite le jeton d'authenticité être transmis avec la demande. Rails utilise le jeton d'authenticité pour éviter les attaques CSRF.

Le moyen le plus simple de s'assurer qu'il est toujours en place est d'utiliser l'assistant form_tag au lieu d'écrire le code HTML à la main.

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

Il est sûr. Je me suis trompé! :) –

0

protect_from_forgery: seulement => [: créer,: mise à jour,: détruire] vous permettra d'économiser quelques problèmes :) (dans votre classe contrôleur)

+0

Cela n'a pas fonctionné. J'ai remarqué que lorsque je supprime le "method = post" l'erreur n'apparaît plus. –

5

Si vous ne générez pas utiliser les aides pour générer vos balises de formulaire, voici comment manuellement le champ caché avec le jeton d'authenticité:

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

Le long des lignes de Nat, ajoutant

<%= token_tag %> 

juste après la balise HTML « forme » fonctionne

+0

Merci! Cela devrait être ajouté à la réponse acceptée. – karlingen

+0

<=% token_tag nil%> doit être utilisé – Kush

1

l'aide d'un assistant formulaire comme d'autres suggèrent ed ci-dessus fonctionnera.

Puisqu'il s'agit d'un formulaire de recherche, la méthode devrait être 'get'. En général, vous devriez utiliser 'get' à moins que quelque chose dans la base de données ne change.

L'utilisation de method = 'get' pour les formulaires de recherche est également plus conviviale pour les signets et le retour.

Questions connexes