RailsっぽくHTMLのフォームをJSのオブジェクトに変換するjQueryプラグイン

RailsっぽくHTMLのフォームをJSのオブジェクトに変換するjQueryプラグインを作りました。たぶん車輪の再発明だけど、僕のググり力では見つけられなかったので。

たとえばこんなHTMLがあるとします。

<form id="item_form">
  <input name="token" value="TOKEN"/>
  <input name="item[title]" value="Title"/>
  <input name="item[tag_data][names][]" value="Ruby"/>
  <input name="item[tag_data][versions][]" value="2.0.0"/>
  <input name="item[tag_data][names][]" value="Vim"/>
  <input name="item[tag_data][versions][]" value=""/>
</form>

これをサブミットするとサーバ側のRailsではハッシュぽくアクセスすることができます。

params[:token]
#=> 'TOKEN'
params[:item][:title]
#=> 'Title'
params[:item][:tag_data]
#=> { names: ['Ruby', 'Vim'], versions: ['2.0.0', ''] }

jQuery.formData はこれと同じようなオブジェクトを作るjQueryプラグインです。

var params = $('#item_form').formData();
params['token']
//=> 'TOKEN'
params['item']['title']
//=> 'Title'
params['item']['tag_data']
//=> { names: ['Ruby', 'Vim'], versions: ['2.0.0', ''] }

例えばBackboneのモデルと組み合わせると、ユーザの入力内容から簡単にインスタンスを生成できて便利です。

var FormView = Backbone.View.extend({
  el: '#item_form',
  events: {
    submit: 'onSubmit'
  },
  onSubmit: function (e) {
    e.preventDefault();
    var model = new MyModel(this.$el.formData().item);
    model.get('title');  //=> 'Title'
  }
});