digifacture

Railsとかデジモノとか色々勉強した事とか作った事とか気になった事とか

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をセットする必要があります。なのでrailsajax用のヘルパを使わずに、独自にjavascriptを書いてdbをいじる時は手動でauthenticity_tokenをいれてあげないといけません。

なるほどねー不正防止なのね

致せり尽くせりだけど仕組みを理解してないとこゆとき困るね