--- layout: old_post title: Railsプラグイン - ActiveJaxの密結合な実装にビックリ permalink: /tatsuya/show/408-rails-activejax ---
ActiveJaxというRailsプラグインを見つけた
「ActiveRecordのモデルをJavaScriptから叩ける」と書いてあり、RESTなWebAPIを叩くJesterの競合になりそうかな、と思ったら全然違った。
Jester-RESTfullなRails向けJavaScriptライブラリ
Jesterの場合はあくまでもRESTなWebAPIに向かって、それっぽいURLでアクセスする。Railsのscaffold resourceで作られたWebAPIを想定してるけど、細かくカスタムも可能で別にPerlでもPHPでもJava, C# 相手は何でも良い。
ActiveJaxの場合は、ActiveRecordモデルの構造を見て動的にJavaScriptを作成しちゃう。こんな感じ
#Model def _active_jax_meta() @@active_jax_meta.values.each do |ajc| if ajc[:finders].empty? ajc[:finders] = ajc[:class].public_methods.select { |m| m.match(/\Afind/) }.reject { |m| ajc[:class].superclass.respond_to?(m) && !m.match(/\Afind\Z/) && !m.match(/\Afind_all\Z/) } end end @@active_jax_meta end #Controller def js response.headers["Content-Type"] = "text/javascript" Dir.glob(File.join(RAILS_ROOT, "app", "models") + "/**/*.rb").each { |f| require f } Dir.glob(File.join(RAILS_ROOT, "app", "controllers") + "/**/*.rb").each { |f| require f } end #View <% ActiveRecord::Base._active_jax_meta.keys.each do |klass| -%> ActiveJax.<%= klass.name.to_s -%> = {}; <% klass.active_jax_finders.each do |finder| -%> ActiveJax.<%= klass.name.to_s -%>.<%= finder -%> = ActiveJax.query_function("/active_jax/service", {klass: "<%= klass.name.to_s -%>", finder:"<%= finder -%>"}); <% end -%> <% end -%>
「俺はRailsさえあれば良い!ペロカパ!」って人はこれでも良いんだろうけど、なんだこれ。ある意味凄い、ビックリ。Jesterと比べるとこんな感じ
・Jester = RESTfullなWebAPIを作ってくれれば、空気を読んでそれっぽいURIにアクセスするよ。カスタムも可能。サーバのことは知らない
・ActiveJax = ActiveRecordのクラス名やメソッドを解析して、それっぽいJavaScriptのオブジェクトを出力するよ。ControllerやViewは自動生成するから気にしないで;)
みたいな。JesterみたいにWebAPIでサーバ & クライアントが分かれていると
・クライアント= Jester以外のライブラリから叩く、API公開して色々叩いてもらう
・サーバ = 重い機能をRails以外で書き直す
と粗結合になって色々おいしい事がある。例えばの話で、はてブWebAPI用に作ったJavaScriptのUIでdel.icio.usを叩けたりする、Tumblr用のツールでsoup.ioが叩けたりする。(WebAPIが似ていれば)
まあ明らかに書き捨てのWebアプリケーションとかなら、ActiveJax的な密結合も楽で良いけど。ちゃんとするなら、ちょっと面倒でも粗結合が良い、まあ当然の話で。