Tuesday, February 27, 2007

Ruby binding SFDC

あまりRubyにはなれていないのだが、ちょっと感覚で使ってみた。

画面を拡大

左が Eclipse にて実行した結果。無事にRubyからSFDCサーバにバインディングでき、データが更新されています。


画面を見て分かるとおり、クライアントのソースコードが非常に少ない。Binding 用に使用している RForce.rb の中身も 220 行ぐらいと非常に簡素化されています。(もちろん、ライブラリが充実しているのでしょけど)

この実装で用意したものは下記のリソースです。
RForce
Rubygems
Builder

RForce はライトウエイト、軽量な Ruby ライブラリです。Salesforce に Web サービスにてバインディングしてくれる有難いものです。RubyGem(通称gem)は Ruby のライブラリを簡単にインストールするツールです。gem は Rails や Rails 関連ライブラリのインストールで重宝しますので、ぜひこの際に入れておきましょう。また、Builder は何か?と思い builder.rubyforge をのぞいてみると↓とある。

"Provide a simple way to create XML markup and data structures."

要は XML のマークアップやらデータ構造を簡単にやってくれるものであろう。

1.Eclipse で Ruby 環境を用意
Ruby関係は・・・Ruby1.9, Rubygems0.9.2 そして Builder2.0 を使用する。Eclipse は 3.2.2で現時点の最新版。Eclipse のオプション->Update からダウンロードを行う。Path を通す。そして gems と builder ライブラリを Ruby Path の lib フォルダに投入して設定完了。

2.Ruby を動かす
設定は終わった、が、動くのか?と思った。

ほとんど触ったことのない Ruby。くじけずどうにかコーディング。試しに・・・久々に思い出したシングルトンパターン。デザインパターンはココしばらくご無沙汰なので、思い出すのに少しかかった。

全体で約 30 行。シングルトンクラスだけだったら 20 行。さすがシンプルトン。

-----------------------------------
# Ruby Singleton Class
class Singleton

private_class_method :new

# Class Variables
@@singletonObject = nil

# Returns this Singleton Object.
# If already created, return the one.
def Singleton.create
if @@singletonObject == nil
@@singletonObject = new
puts "シングルトン・オブジェクトを作成しました"
end
return @@singletonObject
end
end

puts "シングルトン・スタート"

obj1 = Singleton.create
obj2 = Singleton.create

if (obj1 == obj2)
puts "obj1とobj2は同じインスタンスです。"
else
puts "obj1とobj2は同じインスタンスではありません。"
end

puts "終了"
-----------------------------------

無事に動いた。実行結果はもちろん下の図のとおり。





4.Salesforceに接続
次に SFDC へ通信を試みる。RForce のソースを見ると、これもまた短い。
------------
require 'RForce'

binding = RForce::Binding.new 'na3.salesforce.com'

binding.login 'username', 'pw' # username, pw はお使いのものを入力

account_id2 = "0015000000HJLgF";
opportunity = {
:accountId => account_id2,
:amount => "7777210.00",
:name => "New sale for UE +1000",
:closeDate => "2007-09-01",
:stageName => "Closed Won",
:description => "From Ruby Client"
}

puts "Start connecting to SFDC..."
binding.create 'sObject {"xsi:type" => "Opportunity"}' => opportunity
puts "Update success - opporunity -"
たったこれだけ。RForce::Binding.new 'na3.salesforce.com' にて接続先の組織 URL を指定し、後は login + 商談 create。これで完了。実際に結果を web で確認してみると無事に Done.

5.Next Step
RForce.rb のソースをのぞくと約173行目に SFDC 接続先のパスが書いてありました。
'/services/Soap/c/6.0'

どうも今回接続は version6.0 らしい。現最新バージョンが8.0なので、そちらに接続先を変更。

'/services/Soap/c/6.0' -> '/services/Soap/c/8.0'

これで実行すると上手かなかった。in `RForce::Binding#login': Incorrect user name / password (RuntimeError) のエラーが表示される。

8.0 のエンドポイント関係で何かしらログイン部分が違うのでしょう。また今度みてみることにします。

Apex Application

これから Apex 関連について書いていこうと思い立った。

AppExchange, Apex 発展のためにずばずばやっていこう。