[backbone.js] gae/jとslim3とbackbone-relationalを使う時、backboneのmodelのidAttributeはkeyにしちゃダメ。

[backbone.js] gae/jとslim3とbackbone-relationalを使う時、backboneのmodelのidAttributeはkeyにしちゃダメ。
試した日
2012-09-29

backbone.js
0.9.2(※1

backbone-relational.js
github(※2

gae
official web site(※3

slim3
official web site(※4

backboneのcollectionを用意してfetchするという単純な処理でエラーが出た。「同じidのインスタンスを同じモデルで作ることはできません。」という感じのエラーだった。ふむふむ、そうかそうかと思いidを調べたら、一緒のidなんてなかった。

むむ!

と思ってbackbone-relationalのRelationalModelを継承していた部分を、backboneのModelを継承するように変えて再実行したところ、エラーは消えた。

むむむ!

と思ってbackbone-relationalにデバッグをしかけてみたところ、どうもcollection.get(id)関数が怪しい。初心に戻りcolletion.get(id)関数を調べてみた。そうすると「引数のidがobjectだったらid.idとすれば取れる前提」で処理が書かれていた。普通ならこれでOKなんだろう。しかし、愚かにもModelのidAttributeをslim3でいうところのidであるkeyを指定してしまっていた。

そしてkeyというのはもちろんobjectなのであった、、、。というのもちゃんとkeyをstring型に直してフロント側に渡していればこんなことにはならなかったのかもしれない。いつもそうしてるのに、このときはKeyfactory.keyToString処理をサーバー側で行わず、objectとして渡してしまっていた。

このときの解決策は、idというプロパティもmodelのattributesの中にいたので、idAttributeを普通にidに戻したら解決した。

残念な一連の作業報告でした。