LoginSignup
1
1

More than 5 years have passed since last update.

Crystalから始めるsalesforce生活

Last updated at Posted at 2016-07-29

前口上

結構前ですが、Crystal用のHerokuのbuildpackを作りました。

https://github.com/msky026/heroku-buildpack-crystal

Crystal用のbuildbackは公式含め結構あるので、自分に合うのを使えばいいかと思いますが、個人的には色々と細かく設定できたほうがいいので(特に現在のcrystalは破壊的変更が多いのでバージョン指定が出来ないと辛いのと、frost用にビルドコマンドの指定が必要だったので)、自作してみました。

使い方等はこちらでも解説いただいたり、また技術書典で配布しました「Crystalの本(100円)」に記載していますので今回は端折ります。

crystalforce

さて本題ですが、Herokuに続いてCrystal用のsalesforceのREST APIクライアントを作りました。
というか、Ruby用のrestforceの仕様をベースに見よう見まねで作ってみました。

crystalforce

使い方については大体restforceの簡略版的なものになっていますので、先にこちらの記事を見ていると感覚がつかめると思います。

databasedotcom(gem)、restforceでsalesforceに繋いでみる

salesforceでの設定

sf側での設定手順はだいたい以下のとおりです。

  • 接続 -> ビルド -> 作成 -> アプリケーション から 新規の接続アプリケーションを選択し、適当な名前で作成。
  • コンシューマ鍵と、コンシューマ秘密鍵を生成。
  • コールバックURLはhttp://localhost/callbackとかで。
  • 各ユーザの「私の設定」から、アクセストークンの設定(設定したメールに届く)も必要。

作成した接続用アプリの権限も適宜設定しておいてください。

接続アプリケーションの、作成したアプリのOAuthポリシーで、「すべてのユーザは自己承認可能」とかになってないと繋がらないかもしれません。

crystalforceの使い方

取り敢えずインストールはcrystalではお馴染みの、shard.yml

dependencies:
  crystalforce:
    github: msky026/crystalforce

を書いてshards installで。

使用するときは、ソースに

require "crystalforce"

と書くと使えます。

認証

salesforceに接続するときは以下の設定をします。

client = Crystalforce.new({
  :username       => "foo",
  :password       => "bar",
  :security_token => "security_token",
  :client_id      => "client_id",
  :client_secret  => "client_secret"
})
  • username メールアドレス形式のsalesforceのID
  • password salesforceアカウントのパスワード
  • security_token salesforceアカウントのトークン
  • client_id 接続アプリケーションのコンシューマ鍵
  • client_secret 接続アプリケーションのコンシューマ秘密鍵

追加オプションで

  • api_version salesforceのAPIバージョンを指定(34.0とか割と新しめのにしとくとベター)
  • host sandboxに繋ぐときは「test.salesforce.com」を設定

今のところ接続は、上記設定方法のみです。
(restforceはもっといろんな方法ができましたけども)

CRUD

基本的な機能は今のところ、query発行、削除、更新、作成、のCRUDのみです。

query

データを取得したいときはこんな感じです。

testobj = client.query("select Id, Name__c from Testobj__c")

上記で以下の様な結果が返ってきます。

[{"attributes" => {"type" => "Testobj__c", "url" => "/services/data/v34.0/sobjects/Testobj__c/a011000000hhd2oAAA"}, "Id" => "fafdafafad", "Name" => "typeb_1"}, {"attributes" => {"type" => "Testobj__c", "url" => "/services/data/v34.0/sobjects/Testobj__c/a011000000hhd2oAAA"}, "Id" => "a011000000hhd2oAAA", "Name" => "a1"}, {"attributes" => {"type" => "Testobj__c", "url" => "/services/data/v34.0/sobjects/Testobj__c/a011000000ku88tAAA"}, "Id" => "a011000000ku88tAAA", "Name" => "typea_1"}, {"attributes" => {"type" => "Testobj__c", "url" => "/services/data/v34.0/sobjects/Testobj__c/a011000000mLzZ7AAK"}, "Id" => "a011000000mLzZ7AAK", "Name" => "testobj222"}]

クエリに指定したIdとNameをtestobj["Id"]やtestobj["Name"]で参照できます。

query_all

testobj = client.query_all("select Id, Name__c from Testobj__c")

上記でもクエリの結果が取得できますが、queryとの違いは隠しパラメータが見えるかどうかです。

create

以下の手順でデータの作成が行えます。

# Add a new account
client.create('Account', {:Name => 'Foobar Inc.'})
# => '0016000000MRatd'

update

データの更新は以下の用に設定します。

# Update the Account with `Id` '0016000000MRatd'
client.update('Account', '0016000000MRatd', {:Name => 'Whizbang Corp'})
# => true

destroy

最後に削除は以下のとおりです。

# Delete the Account with `Id` '0016000000MRatd'
client.destroy('Account', '0016000000MRatd')
# => true

今後考えていること

restforceでやってたことで、クエリ結果のパラメータをオブジェクトのように参照できないかとか。

例えば、

testobj = client.query("select Id, Name__c from Testobj__c")

の結果はtestobj.Idとかの形で参照できないか、です。ただしこれはrestforceでもMashというツールを使っていることで実現しているのでCrystalでは別の方法が必要ですが。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1