フォームからドキュメントのバインディング。

寒くて途中で起きてしまったので、バインディングの続き

hidden_field とか radio_button とか check_box とかも追加したので、今度はフォームからドキュメントのマッピング。こちらは、jQueryプラグインとして serializeJson メソッドを使えるようにしました。

Rails の場合は、www-form-urlencoded の文字をサーバーでパースして、良きに計らえ、で数値とかbool値とかを型変換してくれるのですが、そうはいかないので、直接ユーザーが入力するtext_field, textarea 以外は、値がJSONフォーマットになるようにする。これで、JSON.parse()を組み合わせることで、value="1" は数値のフィールドとして解釈されますし、value=""1"" は文字列のフィールドとして解釈されるようになります。

ついでに、date_select とか作ったので、日付のフィールドはselectが3つ並ぶわけですが、3つの組をDate型で処理するようにもしました。

独立したライブラリにしようかな、と思ったんですが、まぁどうせjQuery使うので、jQueryプラグインとして、serializeJson() を実装

おかげで、showなどで

<form id="foo">
<%= hidden_field(doc, "_id") %>
<%= hidden_field(doc, "_rev") %>
<%= text_field(doc, "path-to-bind") %>
</form>

とフォームをActionView流儀で生成させつつ、クライアント側では、

db.saveDoc($("form#foo").serializeJson());

CouchDB流儀で簡単に記述できるようになりました。快適快適!

CSRF対策のためのauthtokenをどうしようかな、とか思ったりもしていますが、それはまたあとで。

Q. RJS っぽいのも作ったらいいんじゃない?
A. いや、どっちもJavaScriptだからいらんでしょ。ってかRJS流儀で書けるようにしてしまったらJSがどっちで動くのかますます混乱するじゃないか。

... しかし、これだと、CouchApp いらねーじゃん、というのはいいっこなしで。pushするためだけに使います。

ドキュメントとフォームのバインディング。

昨日の続きで以下のメソッドをCrayonのlib/form.js に追加。

  • text_field(doc, path, options);
  • text_area(doc, path, options);
  • date_select(doc, path, options, html_options);

Railsの text_field(object, method, options) をぱくらせていただきました。ただ、CouchApp の docForm との互換性を考えて、

doc = {
  a : {
    b: {
      c: "foo"
    }
  }
}

のようなときには text_field(doc, "a-b-c", options) という形で-を使ったパスで指定するようにしてあります。specはこの辺: http://github.com/yssk22/crayon/blob/master/spec/spec.form.js#L47