あるコントローラーから別のコントローラーに送信するフォームを作成しようとしています。そうすると、「nil:NilClassの未定義のメソッド'allow_forgery_protection'」が表示されます。ただし、同じコントローラーにPOSTして戻すと、正常に送信されます。
知っておくべきこと
アプリケーションコントローラが
protect_from_forgery
設定されました。:before_filter
起こりうる問題を減らすために、私は何かをいじっていません。どちらのコントローラーにもモデルはありません。両方ともで生成されました
rails g controller <name>
- 違いが生じる場合はRails3.2
app / controllers / first_controller.rb
def myaction
end
app / views / first / 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 %>
app / controllers / second_controller.rb
def myaction
end
app / views / second / myaction.html.erb
<h1>Second#myaction</h1>
<p>Find me in app/views/second/myaction.html.erb</p>
ルート.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):