我正在尝试创建一个从1个控制器提交到另一个控制器的表单。当我这样做时,我得到“未定义的方法'allow_forgery_protection'为nil:NilClass”。但是,如果我回到同一个控制器,它会成功提交。
要知道的事情
我的应用程序控制器已设置protect_from_forgery
。我不是
弄乱:before_filter
或任何东西以减少
可能存在的问题。
两个控制器都没有型号。两者都是使用rails g controller <name>
def myaction
end
<%= 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 %>
def myaction
end
<h1>Second#myaction</h1>
<p>Find me in app/views/second/myaction.html.erb</p>
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):
答案 0 :(得分:0)
我创建了第三个用于测试的控制器(通过相同的步骤),并且表单正确执行了POST。
在同一时间,第二次一直抛出这个伪造错误。
我用rails destroy controller second
删除了第二个控制器,并用rails g controller second
重新创建了它,在routes.rb中保留了相同的路由,一切正常。