form_for(record, options={}, &block)
http://api.rubyonrails.org/ の form_for
自分用メモ
record
モデル名のstringかsymbol or モデルオブジェクトを受け取る
recordのルーティングが config/routes.rb
内でresources
メソッドを使ってRESTfulに設定してあると、url
を明示しなくてもRailsが良きように解釈してくれる。
recordのルーティング設定で namespace
が使われている場合(ex. 名前付きルートがadmin_user_path
)はこうする
form_for [:admin, @user] do |f|
recordに関連が定義されているオブジェクトがある場合、こうする
form_for [@document, @comment] do |f|
と、新規作成時にちゃんと @document
に紐づく@comment
が作られる。
モデルオブジェクトを渡した時の違い
-
input
要素のname
属性に、渡されたモデルオブジェクトのクラス名を判断して入れてくれる。(変更したい場合はas
オプションを使う) - 渡されたオブジェクトが持っている属性の値をつかって初期値を表示する。(-> 永続化されていないオブジェクトでも初期値が表示できるってことかな?)
options
url
フォームのsubmit先
url_for
やlink_to
に渡せる値なら受け取れるため、名前付きルートを指定することができる。
recordに渡されたものがstringかsymbolでurl
オプションが指定されていない場合は現在のurlにフォームは送信される
namespace
設定された値をフォームの要素のid
属性に接頭語として使うことで、フォームごとにユニークなものにする。
form_for @person, namespace: :hoge do |f|
= f.text_field :name # <input type="text" id="hoge_person_name" name="person[name]">
method
フォーム送信時のメソッド。たいていget
かpost
だが、delete``patch``put
などが指定された場合は、type="hidden" name="_method"
のinput
要素が追加される
remote
true
にセットされることでsubmitの挙動をUnobtrusive JavaScript drivers
でコントロールすることができる。
用語:
Unobtrusive JavaScript
https://en.wikipedia.org/wiki/Unobtrusive_JavaScript
html
form
タグにつけたいhtmlの属性を設定できる
data
属性に関しては、htmlオプションを使わずにそのまま書ける。
form_for @person, data: {hoge: "hoge"}
authenticity_token
カスタムのauthenticity_token
を使いたい時やauthenticity_token
が必要ない時に設定
enforce_utf8
false
にセットすると、type="hidden" name="utf8"
というinput
要素が追加されなくなる
(IE8までのブラウザ向けにパラメータをUnicodeでエンコードするためのものらしい。
https://stackoverflow.com/questions/3222013/what-is-the-snowman-param-in-ruby-on-rails-3-forms-for/3348524#3348524)