2009-09-05 10 views
5

Mam prosty formularz tak:Szyny prosta forma daje błąd 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> 

oraz kontroler z tą metodą:

def busca 
    puts params[:searchText] 
    end 

Kiedy zrobić kliknij na przycisk obrazu w formie Otrzymuję ActionController :: InvalidAuthenticityToken. oto pełna 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 Wyślij” /Library/Ruby/Kamienie szlachetne/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 zadzwoń pod numer " /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters. RB: 225: w 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 Pamięć podręczna ' /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 wyślij' /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 proces ' /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

Co się dzieje?

Odpowiedz

7

Domyślnie wszystkie działania non-get wymaga tokenu autentyczności być przekazane wraz z wnioskiem. Railsy używają tokenu uwierzytelniania, aby uniknąć ataków CSRF.

Najprostszym sposobem zapewnienia, że ​​jest zawsze na miejscu, jest użycie pomocnika form_tag zamiast ręcznego pisania kodu HTML.

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

Na pewno jest. Poprawiono mnie! :) –

0

protect_from_forgery only => [: tworzyć: aktualizacji: zniszczyć] pozwoli Ci zaoszczędzić trochę kłopotów :) (w klasie Controller)

+0

To nie zadziałało. Zauważyłem, że po usunięciu "method = post" błąd już się nie pojawia. –

5

Jeśli nie używać pomocników do generowania tagów formularza, to jak ręcznie generować pole ukryte z tokena autentyczności:

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

Wzorując się Nat, dodając

<%= token_tag %> 

po prostu działa HTML „forma” tag

+0

Dziękujemy! To powinno zostać dodane do zaakceptowanej odpowiedzi. – karlingen

+0

<=% token_tag zero%> powinno być używane – Kush

1

pomocą formularza pomocnika jak inni sugerują, Powyżej będzie działać.

Ponieważ jest to jednak forma wyszukiwania, metoda powinna być "get". Ogólnie rzecz biorąc, powinieneś użyć 'get', chyba że coś w bazie danych ulegnie zmianie.

Korzystanie z metody = 'get' dla formularzy wyszukiwania jest również bardziej przyjazne dla zakładek/przycisków z powrotem.