フォームからドキュメントのバインディング。
寒くて途中で起きてしまったので、バインディングの続き。
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。