2009-09-05 12 views
5

Tengo una forma simple como esto:Rieles forma sencilla da InvalidAuthenticityToken error

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

y un controlador con este método:

def busca 
    puts params[:searchText] 
    end 

Cuando lo haga un clic en el botón de imagen en forma Obtengo un ActionController :: InvalidAuthenticityToken. aquí está 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 Enviar' /Library/Rubí/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 llamada ' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters. RB: 225: en 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 caché ' /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 send' /Library/Ruby/Gems/1.8/gems/actionpack -2.2.2/lib/action_controller/base.rb: 524: en 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 proceso ' /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 requieren ' /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 requieren' /Biblioteca /Ruby/Gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49

¿Qué está pasando?

Respuesta

7

Por defecto, todos los no-hay acciones requiere el token de autenticidad para ser pasado junto con la solicitud. Rails usa el token de autenticidad para evitar los ataques de CSRF.

La manera más fácil de asegurarse de que siempre está en su lugar, es utilizar el ayudante form_tag en lugar de escribir el HTML a mano.

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

Seguro que sí. ¡Estoy corregido! :) –

0

protect_from_forgery: only => [: crear,: actualización,: destruir] le ahorrará algunos problemas :) (en la clase Controller)

+0

No funcionó. Noté que cuando eliminé "method = post" el error ya no aparece. –

5

Si no se utiliza para generar sus ayudantes etiquetas de formulario, así es como se genera manualmente el campo oculto con el token de autenticidad:

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

A lo largo de las líneas de Nat, añadiendo

<%= token_tag %> 

justo después de la etiqueta HTML "forma" funciona

+0

¡Gracias! Esto debe agregarse a la respuesta aceptada. – karlingen

+0

<=% token_tag nil%> se debe usar – Kush

1

el uso de un asistente de formulario como otros han sugerir ed arriba funcionará.

Dado que este es un formulario de búsqueda, el método debería ser 'get'. En general, debe usar un 'get' a menos que algo en la base de datos vaya a cambiar.

El uso de method = 'get' para los formularios de búsqueda es más amistoso con el marcador/botón de retroceso también.

Cuestiones relacionadas