6

私はこのような単純なフォームを持っています:

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

そして、この方法のコントローラー:

  def busca
    puts params[:searchText]
  end

フォームの画像ボタンをクリックすると、ActionController::InvalidAuthenticityTokenが表示されます。これが完全な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 send'/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 call'/Library/ Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/ call' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:629:in filters.rb:225:in run_before_filters' /Library/Ruby/Gems/1.8/gems /actionpack-2.2.2/lib/action_controller/filters.rb:615:inperform_action_without_benchmark'/Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:inperform_action_without_rescue ' call_filters' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:610:in _ perform_action_without_rescue' /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in /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:inPerform_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 send'/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 require'/Library/Ruby /Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in require new_constants_in' /Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in ' /Library/Ruby/Gems/1.8/gems/rails-2.2 .2 / lib / Commands / server.rb:49

何が起こっている?

4

4 に答える 4

23

ナットの方針に沿って、追加

<%= token_tag %> 

HTMLの「フォーム」タグが機能した直後

于 2009-11-03T07:43:53.120 に答える
9

デフォルトでは、すべての非GETアクションでは、信頼性トークンが要求とともに渡される必要があります。Railsは、真正性トークンを使用してCSRF攻撃を回避します。

常に配置されていることを確認する最も簡単な方法はform_tag、HTMLを手動で作成する代わりに、ヘルパーを使用することです。

<% form_tag "/home/search", :name => "searchForm" do %>
  fields here
<% end %>
于 2009-09-05T22:39:33.217 に答える
7

ヘルパーを使用してフォームタグを生成しない場合、これは、信頼性トークンを使用して非表示フィールドを手動で生成する方法です。

<input type="hidden" 
       value="<%= form_authenticity_token() %>" 
       name="authenticity_token"/>
于 2009-09-06T12:09:15.373 に答える
1

他の人が上で提案したようにフォームヘルパーを使用すると機能します。

ただし、これは検索フォームであるため、メソッドは実際には「get」である必要があります。一般に、データベース内の何かが変更されない限り、「get」を使用する必要があります。

検索フォームにmethod='get'を使用すると、ブックマーク/戻るボタンも使いやすくなります。

于 2010-11-12T00:06:13.233 に答える