basyura's blog

あしたになったらほんきだす。

ようやく動いた

  • 環境がおかしいのか起動でこけちゃう
  • gem と ruby のバージョンをいろいろ試してもドツボにはまる一方
  • サンプル見て説明見てその通り書いても動かない

で半ば放置してたんだけど。

GoRuCo 2010 - Alex MacCaw - Bowline: Ruby Desktop Applications from Gotham Ruby Conference on Vimeo.

開発者のデモを見(パクリ)ながら最低限の動作が確認できた。

起動して初期データを表示したところ


config/initializers/ の下にファイルを置いておくと起動時に読み込まれるので、必要な model を作成しておく。

binder を呼び出して model を作成


パラメータは javascript から ruby のオブジェクトに変換されて渡される。

Bowline.invoke("TweetsBinder", "sing" , "aaaa");
Bowline.invoke("TweetsBinder", "sing" , ["aaaa" , "bbb" , "cccc"]);
Bowline.invoke("TweetsBinder", "sing" , {a:"A" , b:"B" , c:"C"});

class TweetsBinder < Bowline::Binders::Collection
  bind Tweet
  class << self
	def initial
	  #[{:body => "Hello Tweet"}]
	  klass.all
	end
	def sing(param)
	  tweet = Tweet.new
	  tweet.body = "sing #{param.class}" + param.to_s
	  tweet.save
	end
  end
end

手順

以下、自作サンプル(git://github.com/basyura/bowline-test.git) を動かす場合の手順。

  ruby のバージョン

    $ ruby -v
      ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.4.0]

  bowline の最新版をインストール

    $ git clone git://github.com/maccman/bowline.git
    $ cd bowline
    $ gem build hoge.gemspec
    $ gem install -l foo.gem

  テストリポジトリ作成

    $ git clone git://github.com/basyura/bowline-test.git
    $ cd bowline-test
    $ bowline-bundle

  メソッドが変更されているので直す

    vendor/gems/ruby/1.9.1/gems/bowline-0.9.3/lib/bowline/initializer.rb

    def set_autoload_paths
      ActiveSupport::Dependencies.load_paths      = configuration.autoload_paths.uniq
      ActiveSupport::Dependencies.load_once_paths = configuration.autoload_once_paths.uniq
    end
    ↓
    def set_autoload_paths
      ActiveSupport::Dependencies.load_paths      = configuration.autoload_paths.uniq
      ActiveSupport::Dependencies.load_once_paths = configuration.autoload_once_paths.uniq
    end

  起動

    $ ruby script/run

<< 初期データ >>

  config/initializers/tweets.rb

  tweet = Tweet.new
  tweet.body = "Hello World" 
  tweet.save
 
<< model 連携 >>

  index.html
    Bowline.invoke("TweetsBinder", "sing" , "aaaa");
    Bowline.invoke("TweetsBinder", "sing" , ["aaaa" , "bbb" , "cccc"]);
    Bowline.invoke("TweetsBinder", "sing" , {a:"A" , b:"B" , c:"C"});

  tweets_binder.rb
    class TweetsBinder < Bowline::Binders::Collection
      bind Tweet
      class << self
        def initial
          #[{:body => "Hello Tweet"}]
          klass.all
        end
        def sing(param)
          tweet = Tweet.new
          tweet.body = "sing #{param.class}" + param.to_s
          tweet.save
        end
      end
    end


<< コンソールへのログ出力 >>
  Bowline.log(users);

<< デバッグログの出力 @index.html >>
  Bowline.trace = true;

一番引っかかるのが binder を呼び出すところ。

Bowline.invoke("TweetsBinder", "sing" , {a:"A" , b:"B" , c:"C"});

もっと簡単な呼び出し方あるはずなんだけどなぁ。サンプルでは

$("tweets").invoke("sing")

みたいな感じでやってんだけど。