• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

haml は構造化文章をシンプルかつ強力に記述することができるが、 複数行のデータの扱いには以下の理由で不向きである。

  • 行指向であるため適切なインデントの記述が強要される
  • 頑張って埋め込んでも可読性が落ちて全体の構造が把握し辛くなる

これを改善するには、コード(構造情報)とデータの分離が必要になる。

inline filter module

   1  module Inline
   2    include Haml::Filters::Base
   3   
   4    def self.[](key)
   5      @@data[key.to_s] rescue nil
   6    end
   7   
   8    def render(str)
   9      @@data = Hash[*str.split(/^\s*@@\s*(\w+)\s*\n/m)[1..-1]]
  10      return nil
  11    end
  12  end

上記を評価することで、 sinatra の in file template のようにデータ群を管理できるようになる。

入力(haml)

   1  %h1 Inline Filter
   2  .describe= Inline[:describe]
   3  .author created by #{Inline[:author]}
   4   
   5  :inline
   6   @@ describe
   7   This filter easily separates structure and data.
   8   You can use in-file-templates like sinatra.
   9   
  10   @@ author
  11   maiha@wota.jp

出力(html)

   1  <h1>Inline Filter</h1>
   2  <div class='describe'>
   3    This filter easily separates structure and data.
   4    You can use in-file-templates like sinatra.
   5  </div>
   6  <div class='author'>created by maiha@wota.jp</div>

posted by Png maiha on Tue 20 Oct 2009 at 20:59

Gears を使うには

  1. gears_init.js の読み込み
  2. 低レベルAPIを駆使

という面倒な作業が必要になる。

具体的には

   1  <script type="text/javascript" src="gears_init.js"></script>

   1  var db = google.gears.factory.create('beta.database');
   2  db.open("database-demo");
   3  var rs = db.execute("select name from users");
   4  while(rs.isValidRow()) {
   5    name = rs.fieldByName('name');
   6    rs.next();
   7  }
   8  rs.close();
   9  db.close();

のようなコードが必要になり、今日日こういうのは書きたくない。 そこで、

active_record.js を使う

Aptana が提供してる activejs プロジェクトの ActiveRecord ライブラリを利用すると、以下のようにすっきりする。

   1  <script type="text/javascript" src="active_record.js"></script>

   1  ActiveRecord.connect(ActiveRecord.Adapters.Gears,'database-demo');
   2  var User = ActiveRecord.create('users', {name:''});
   3  User.create({name:'maiha'});

RailsのARを忠実にJavaScriptへ移植してあるため、 ARに慣れていればほぼドキュメントなしで使えるのが嬉しい。

   1  maiha = User.findByName('maiha');  // Dynamic Finder
   2  name  = maiha.name; // Accessor methods
   3  maiha.name = 'foo';
   4  maiha.save();
   5  
   6  User.count();
   7  User.find({all: true, order: 'name'});

他にも

  • Validation
  • Callback
  • Relation (hasOne, hasMany, belongsTo)
  • Migration

といった機能が実装されており、 ARの移植物としてみても完成度が非常に高い。 ちなみに、js のサイズは compaction なしで200KB程度。

参考

  • http://activerecordjs.org/
posted by Png maiha on Mon 19 Oct 2009 at 05:51
Contents
haml で in file template
ActiveRecord on Gears
Comments
maiha: 追記)対応は約1営業日でした。チームの忙しさに応じて変動するとは思いますが、大体の目安情報とい... '10-4
maiha: なるほど。rails のログから実行したクエリを抜き出したいと思うことがよくありまして。 あ... '10-3
winebarrel: レポートありがとうございます。 削除できない件は修正しました。 SQLのparserはTC/... '10-2
maiha: なるほど。ありがとうございます! '10-2
ursm: Haml 2.2 以降はどこでも式展開が使えるようになったので、== は意味がなくなりました。... '10-2
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ