There's an echo in my head

日々のメモ。

form_forでprefixを指定する

ActionView::Helpers::FormBuilder#form_for(record, options = {}, &block)では:asオプションを指定することで各種フィールドのname属性に付けられるprefixを指定できる。

たとえば@person = Person.newに対して、デフォルトだと

= form_for @person do |f|
  = f.text_field :name

とすれば、

<form>
  <input type="text" name="person[name]" value="" />
</form>

みたいなフォームが生成され、このpersonインスタンスのクラス名から決定されている。

このperson[name]personの部分を指定するには次のように:asオプションを指定すればよい。つまり、

= form_for @person, as: "human" do |f|
  = f.text_field :name

としたら、

<form>
  <input type="text" name="human[name]" value="" />
</form>

のようになる。

普段はあまり指定することがないかもしれないけど、PersonSTIを使っていてMaleFemaleインスタンスなんだけど、フォームや処理系ではPersonクラスのインスタンスとして処理したい場合(StrongParametersで受けるハッシュ名をバラけるのを避けたいとか)なんかには有効だと思う。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。