2016-11-29 88 views
1

Rails的5我有一个简单的应用程序,我使用Rails 5.0.0.1(应用程序被调用SimpleTest的 - 它是那样简单,因为我可以把它),以图出一些东西在Rails 5.我得到一个奇怪的错误。的ActionController :: InvalidAuthenticityToken采用后仅

这里的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 

而这里的应用程序/视图/富/ 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 :: InvalidAuthenticityToken在FooController的#巴兹

我已经签了一堆答案。我有在应用程序/视图/布局/ application.html.erb <%= csrf_meta_tags %>

这仅发生后。得到它,它工作正常。不过,我需要使用帖子。

此外,有一个解决方案,但它并没有道理给我。我可以将下面的代码添加到我的控制器,如果格式是JSON它(如果我正确地理解它)应重置会话的顶部,突然它的工作原理:

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

但格式文本/ html!此外,会议并未重置(我可以通过session[:qux]告诉为什么会这样有什么影响。如果我只是用:?

protect_from_forgery with: :reset_session 

它的工作原理,但当然重置会话使用:null_session。地方:reset_session有同样的效果(包括有和没有,如果) 我还没有做什么特别的除了添加代码,所有我所做的就是:。

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

我跑红宝石2.3。 0p0(2015-12-25 revision 53290)[x86_64-linux]在Debian 8上。

+0

当您提交表单,你看到的authenticity_token参数?(你可以在错误页面的底部看到一个参数列表) – jphager2

+0

'

回答

1

的问题是,你需要使用一个表单辅助函数,它会自动设置为authenticty_token一个隐藏的输入。

在您查看你可以使用的form_tag(这是这种类型的最简单的助手)

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

显然我不'但是对于未来的探索者来说,这个解决方案是完美的,并且@ cdimitroulas的答案解释了为什么''''reset_session,如果: - > {request.format.json?}'起作用,为什么'protect_from_forgery它不适用。 – Joshua

2

由于jphager2提到这是由Rails的针对CSRF(跨站请求伪造)保护的问题时,使用输入表单,并可以通过使用表单助手而不是简单的HTML表单轻松解决。

你可以看到费萨尔对这一话题在这里伟大的答案 - >Understanding the Rails Authenticity Token

+0

谢谢,这真的有帮助。有很多线程,我没有找到这个(我可能过分关注错误消息作为搜索文本)。如果我理解正确,'protext_from_forgery with:'的工作原理是强制使用身份验证令牌。这看起来是否正确? – Joshua

+0

我对轨道相当陌生,但据我所知,这是正确的! – cdimitroulas

相关问题