0

あるコントローラーから別のコントローラーに送信するフォームを作成しようとしています。そうすると、「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):
4

1 に答える 1

0

テスト用に 3 番目のコントローラーを作成し (まったく同じ手順で)、フォームは POST を適切に実行しました。

この間、2 番目は一貫してこの偽造エラーをスローしました。

2 番目のコントローラーを で削除し、routes.rb に同じルートを保持して再作成し、すべてが正常に機能しましたrails destroy controller secondrails g controller second

于 2012-08-05T15:05:50.263 に答える