既存のRailsプロジェクトで、id以外は似たようなソースのCoffeeScriptがいくつかできてしまったので、ここをJavaScriptのMVCですっきり解決できるんじゃないか?と思って、AngularJSを調べてみた。
gemにangularjs-railsというのがあったのでこれを使ってみた。
結論からいうと、既存のRailsプロジェクトにAngularJSを統合するのはかなりの苦行かつ、Rails側のソースとの重複が発生しそうだなということだった。
最初はなかなかよさげかなーと思ったのだが、嫌になったのは、編集のときだった。
http://localhost:3000/users/1/edit などにアクセスがあったら、Railsならば
- Controllerで@userができる
- Viewのform_for @userでフォームが作られる。
- 既存のデータが入力エリアに反映される。
となる。
しかし、ここにAngularJSが絡むと、
- Controllerで@userができる
- Viewのform_for @userでフォームが作られる。
- 既存のデータが入力エリアに反映される。(ただし一瞬)
- AngularJSのモデルの初期化が行われる。
- 入力エリアに紐づいているng-modelの値が空なので入力エリアが空欄になる!
となってしまい、困る。
これを直すには、各入力エリアに
f.input :name, input_html: {ng-model="user.name" ng-init="user.model='#{@user.name}'"}
のように書かないといけない。
正直、こんなの、入力エリアが大量にあったら書きたくないのである。
既存のRailsプロジェクトでなければ、ユーザーの情報をAjaxで引っ張ってきてAngularJSのモデルにJSONを突っ込めばいいだけなんだろうけれども、既に出来上がっているものに対して、それを壊してまで対応する価値はなさそうだ、という結論に至った。
サーバサイドでガッツリ作り込んでいるプロジェクトに後々適用できるものではなさそうである。
最初っからJavaScriptMVCをやってみるには、よさそうである。
AngularJSを使う場合には、サーバ側は完全にAPIサーバじゃないと向かんかなと。
Railsとの相性は、既存のプロジェクトとはダメ。新規のプロジェクトでやりとりがJSONのみならばOKという気がする。
というかAngularJS自体、GAEで使うために生まれてきたんじゃないの?という気がする。
まぁGoogle製だしね。