--- layout: old_post title: Railsプラグイン - ActiveJaxの密結合な実装にビックリ permalink: /tatsuya/show/408-rails-activejax ---

ActiveJaxというRailsプラグインを見つけた

ActiveJax - Simpltry 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的な密結合も楽で良いけど。ちゃんとするなら、ちょっと面倒でも粗結合が良い、まあ当然の話で。