1

私は単純なアプリケーションを持っていますが、Rails 5.0.0.1を使用しています(このアプリケーションはsimpletestと呼ばれています。私は奇妙なエラーが発生しています。ActionController :: InvalidAuthenticityToken in Rails 5 with post only

はここでここでのconfig/routes.rbを

Rails.application.routes.draw do 
    root "foo#bar" 
    get "dobaz" => "foo#bar" 
    match "dobaz" => "foo#baz", via: :post 
end 

だアプリ/コントローラ/ foo_controller.rb

class FooController < ApplicationController 
    def baz 
     if session[:qux].nil? || params[:reset] == "true" 
     session[:qux] = 0 
     else 
     session[:qux] += 1 
     end 
     @qux = session[:qux] 
     @format = request.format 
     render 'bar' 

    end 
end 

だし、ここでのアプリ/ビュー/ fooの/ bar.html.erb

<p>Qux: <%= @qux %></p> 
<p>Format: <%= @format %></p> 
<form action="/dobaz" method="post"> 
<p>Reset: 
<input type="radio" name="reset" value="true">True</input> 
<input type="radio" name="reset" value="false">False</input> 
<input type="submit"/> 
</form> 

私は認証やログインなど何も使用していません。私は(明らかに)セッションを使用しています。

私は実際にアプリを実行しようとすると、私は例外ページに次のエラーを取得:

ActionController :: FooController#バズでInvalidAuthenticityToken

私は答えの束をチェックしました。私は<%= csrf_meta_tags %>をapps/views/layouts/application.html.erbに持っています。

これは投稿時にのみ発生します。 getでは、うまく動作します。しかし、私はポストを使用する必要があります。

さらに解決策もありますが、それは私には意味がありません。私は、フォーマットはJSONであれば、セッションをリセットする必要があります(私はそれを正しく理解していれば)私のコントローラの先頭に次のコードを追加することができ、そして突然、それが動作します:

protect_from_forgery with: :reset_session, if: ->{request.format.json?} 

が、フォーマットが/テキストですhtml! 。?また、セッションが(私はsession[:qux]を経由して言うことができるように私は使用している場合は、なぜこれがどんな効果を持つことになりリセットされていない:

protect_from_forgery with: :reset_session 

それは動作しますが、もちろんそれは、セッションをリセットで:null_sessionを使用します。 :reset_sessionの場所は(ととがなければ両方)と同じ効果があり、私は何も特別なコードを追加する以外にやった 、私がやったすべてがある:。。私はルビー2.3を実行している

rails new simpletest 
[copied over Gemfile] 
bundle install 
rails generate controller foo bar 

。 0p0(2015-12-25リビジョン53290)Debian 8の[x86_64-linux]

+0

フォームを送信すると、あなたはauthenticity_tokenパラメータを見ていますか?(あなたが底部に向かっエラーページのリクエストからパラメータのリストを見ることができます) – jphager2

+0

'の」>' –

答えて

1

問題は、authenticty_tokenの隠し入力を自動的に設定するフォームヘルパーを使用する必要があることです。

あなたがちょうど

<!-- in app/views/foo/bar.html.erb --> 
<%= form_tag "/dobaz" do %> 
    <p>Reset: 
    <input type="radio" name="reset" value="true">True</input> 
    <input type="radio" name="reset" value="false">False</input> 
    <input type="submit"/> 
<% end %> 
+0

どうやら私は「ドントンカウントupvotesの資格はなく、将来の探検家のために、このソリューションは完璧に動作し、なぜ 'protect_from_forgeryとする@ cdimitroulasの答えと一緒に、説明しています:RESET_SESSION、場合: - > {?request.format.json}'作品にもかかわらず、それは適用されません。 – Joshua

2

jphager2はこれがCSRF(クロスサイトリクエストフォージェリ)に対するRailsの保護に起因する問題である述べたように(このタイプの最も簡単なのヘルパーである)form_tag使用することができますビューで単純なHTMLフォームではなくフォームヘルパーを使用することで簡単に解決できます。

あなたはここに、このトピックに関するファイサルの偉大な答えを見ることができます - >Understanding the Rails Authenticity Token

+0

ありがとう、これは本当に役立ちます。これには多くのスレッドがあり、私はこれを見つけられませんでした(私はおそらく、エラーメッセージに検索テキストとして重複していました)。私が正しく理解していると、 'protext_from_forgery with:'の理由は、認証トークンを強制的に使用することになります。それは正しいようですか? – Joshua

+0

私はかなり新しいレールですが、それが正しいと理解する限りです! – cdimitroulas

関連する問題