Rails表单提交导致nil:NilClass的未定义方法'allow_forgery_protection'

时间:2012-08-04 19:33:55

标签: ruby-on-rails

我正在尝试创建一个从1个控制器提交到另一个控制器的表单。当我这样做时,我得到“未定义的方法'allow_forgery_protection'为nil:NilClass”。但是,如果我回到同一个控制器,它会成功提交。

要知道的事情

  • 我的应用程序控制器已设置protect_from_forgery。我不是 弄乱:before_filter或任何东西以减少 可能存在的问题。

  • 两个控制器都没有型号。两者都是使用rails g controller <name>

  • 生成的
  • Rails 3.2如果它有所作为

应用程序/控制器/ first_controller.rb

def myaction
end

应用程序/视图/第一/ myaction.html.erb

<%= form_tag(url_for(:controller => 'second', :action => controller.action_name), :method => :post) do %>
  <fieldset>
    <%= label_tag(:file_dir, "File location") %>
    <%= text_field_tag :file_dir, "/var/log" %>
  </fieldset>
  <%= submit_tag "Submit" %>
<% end %>

应用程序/控制器/ second_controller.rb

def myaction
end

应用程序/视图/第二/ myaction.html.erb

<h1>Second#myaction</h1>
<p>Find me in app/views/second/myaction.html.erb</p>

的routes.rb

 match 'first/:action' => 'first#:action'
 match 'second/:action' => 'second#:action'

可能是我对CSRF缺乏了解,但我不知道如何简单地将:controller => 'second'更改为:controller => 'first'来确定几乎相同的控制器是否有效。

部分日志

# Rendered the form
Started GET "/first/myaction" for 127.0.0.1 at 2012-08-04 14:20:00 -0500
Processing by FirstController#myaction as HTML
Rendered first/myaction.html.erb within layouts/application (3.7ms)
Completed 200 OK in 142ms (Views: 141.9ms | ActiveRecord: 0.0ms)


# Submitted the form here
Started POST "/second/myaction" for 127.0.0.1 at 2012-08-04 14:22:00 -0500
Processing by SecondController#myaction as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xyQetj0Wdks+iuOXNjrxs96TbEJOw4ktURTrraEARoU=",<everything else looks fine>}
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `allow_forgery_protection' for nil:NilClass):

1 个答案:

答案 0 :(得分:0)

我创建了第三个用于测试的控制器(通过相同的步骤),并且表单正确执行了POST。

在同一时间,第二次一直抛出这个伪造错误。

我用rails destroy controller second删除了第二个控制器,并用rails g controller second重新创建了它,在routes.rb中保留了相同的路由,一切正常。