Railsの送信フォームタグとform_forとauthenticity_token
色々試すうちに独自に送信フォームを作ろうと思って/viewのhtml.erbにhtmlタグを直接
<form accept-charset="UTF-8" action="/apps" class="new_app" data-remote="false" id="new_app" method="post"></form>
<input id="app_name" name="app[name]" size="30" type="text">…
<input name="commit" type="submit" value="Create App">
って書いても機能しないけどform_for使って
<%= form_for(@apps[0]) do |f| %>
送信フォームをRailsに作ってもらうとちゃんと機能する。
formタグにpostって書けばパラメータをRailsに渡してくれるんちゃうかー
html手打ちとRails生成で何が違うのか色々調べるとform_forを使うと生成されるhtmlに
<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="_method" type="hidden" value="put"><input name="authenticity_token" type="hidden" value="UpkYcXXIEfG5D3aVZ48Ick9iRRg+iroZ9YO21EgC+SM="></div>
っていう身に覚えのないのないタグが書かれている。
authenticity_token?認証か何か?と思ってsafariのwebインスペクタでコードを削ってみるとform_forで生成された送信フォームも機能しなくなった。
それで調べてみると
CSRFの対応について、rails使いが知っておくべきこと - おもしろWEBサービス開発日記
先ほども書きましたが、get以外の動詞(POST, PUT, DELETE)を使う時は、authenticity_tokenをセットする必要があります。なのでrailsのajax用のヘルパを使わずに、独自にjavascriptを書いてdbをいじる時は手動でauthenticity_tokenをいれてあげないといけません。
なるほどねー不正防止なのね
致せり尽くせりだけど仕組みを理解してないとこゆとき困るね