Salesforce APIとRailsでSalesforceデータを取得する

`別サイトで2014/4/28に投稿した記事です。別サイト閉鎖につき、移転しました。情報が古い可能性があるので、ご注意ください。`

## 概要
Salesforceは、言わずと知れたクラウド上でSFAサービスを提供する会社です。
SFA（Sales Cloud）の他に、カスタマーサービス（Service Cloud）やアプリ基盤サービス（Salesforce1 Platform）などがあります。

今回は、Ruby on Railsで、Salesforce APIを叩いて、Salesforceユーザの一覧と詳細を表示します。

## 公式サイト
[http://www.salesforce.com/jp/](http://www.salesforce.com/jp/)

## 価格
↓ はSales Cloudの価格表です。

[http://www.salesforce.com/jp/crm/sales-force-automation/pricing-editions.jsp](http://www.salesforce.com/jp/crm/sales-force-automation/pricing-editions.jsp)

タブに、Service CloudやSalesformce1 Platformがあるので、サービスメニューごとに価格を確認できます。

## gem
今回使用するgemは [https://github.com/heroku/databasedotcom](https://github.com/heroku/databasedotcom) です。

## 手順
### 準備
    rails new salesforce_api
    cd salesforce_api

### Gemfileにgemを追加する
```
# Salesforce
gem 'databasedotcom'
```

    bundle install # gemをインストール

### Salesforce APIにアクセスするための情報を集める
#### Salesforceで接続アプリケーションを作成する

* Salesforceにブラウザでログインする。
* 「設定」→「ビルド」内の「作成」→「アプリケーション」をクリックすると、下の方に「接続アプリケーション」がある。
* 「接続アプリケーション」の横の「新規」をクリックして、接続アプリケーションを作成する。
* 作成した接続アプリケーションのページで「コンシューマ鍵」と「コンシューマの秘密」を入手できる。

＊ヘルプの「[接続アプリケーションの作成](https://help.salesforce.com/apex/HTViewHelpDoc?id=connected_app_create.htm&language=ja)」にこの辺りのことが書いてあります。gemのREADMEには、どこで認証情報が存在しているのか書いていなかったので、見つけるのに少々時間がかかりました。

#### セキュリティトークンを取得する
セキュリティトークンは、「私の設定」ー「個人用」ー「私のセキュリティトークンのリセット」でリセットすると、セキュリティトークンが登録しているメールアドレスに送られてきます。

### 環境変数を設定する
    export DATABASEDOTCOM_CLIENT_ID=xxx # 接続アプリケーションの「コンシューマ鍵」を設定
    export DATABASEDOTCOM_CLIENT_SECRET=xxx # 接続アプリケーションの「コンシューマの秘密」を設定
    export DATABASEDOTCOM_CLIENT_USERNAME=xxx # ログインに使用しているEメールアドレスを設定
    export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD=xxx # ログインに使用しているパスワード＋セキュリティトークンの文字列を連結して設定。

* なお、今回は、ユーザ名とパスワードを使う方式で認証しましたが、他に2方式あります。

### RailsコンソールでSalesforce APIでアクセスする
#### Salesforceの認証
    rails console
    > client = Databasedotcom::Client.new client_id: ENV['DATABASEDOTCOM_CLIENT_ID'], client_secret: ENV['DATABASEDOTCOM_CLIENT_SECRET']
    > client.authenticate :username => ENV['DATABASEDOTCOM_CLIENT_USERNAME'], :password => ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD']

#### データの取得
    > user_class = client.materialize("User") # "User"クラスを使えるようになる
    > User.first # 最初に登録したユーザを取得する

#### データの更新
自分の別名を更新する例です。

＊この操作はデータを変更するので、__本番環境では試さないでください__。まずは、Developerアカウントなどで実行し、本番環境とは別の環境で試してみてください。

    > user_class = client.materialize("User")
    > u = User.find_by_Name("YOUR NAME") # 自分のユーザアカウントを取得します。
    > u.Alias = "NEW ALIAS" # 試しに新しい別名をセット。
    > u.save # 保存します。

* 元に戻すのを忘れずに！

### ユーザの一覧と詳細を閲覧する
#### ユーザを扱うコントローラを追加する

app/controllersの下に、salesforce_users_controller.rbを追加します。

```
class SalesforceUsersController < ApplicationController
  def index
    salesforce_client
    user_class = @client.materialize("User")
    @users = User.all
  end

  def show
    salesforce_client
    user_class = @client.materialize("User")
    @user = User.find_by_Id(params[:id])
  end

  private

  def salesforce_client
    @client = Databasedotcom::Client.new client_id: ENV['DATABASEDOTCOM_CLIENT_ID'], client_secret: ENV['DATABASEDOTCOM_CLIENT_SECRET']
    @client.authenticate :username => ENV['DATABASEDOTCOM_CLIENT_USERNAME'], :password => ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD']
  end
end
```

#### ユーザ一覧表示のビューを追加する

app/views/salesforce_usersの下に、ビューファイルを追加します。

__index.html.erb__

```
<h1>SalesforceUsers#index</h1>

<table>
  <thead>
    <tr>
      <th>Id</th>
      <th>Username</th>
      <th>Alias</th>
    </tr>
  </thead>

  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= link_to user.Id, "/salesforce_users/#{user.Id}"  %></td>
        <td><%= user.Username %></td>
        <td><%= user.Alias %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

#### 個別ユーザ表示のビューを追加する
__show.html.erb__

```
<h1>SalesforceUsers#show</h1>

<p>Username: <%= @user.Username %></p>
<p>Name: <%= @user.Name %></p>
<p>Alias: <%= @user.Alias %></p>
```

#### ルーティングの設定

```
get 'salesforce_users/index' => 'salesforce_users#index'
get 'salesforce_users/:id' => 'salesforce_users#show'
```

## まとめ
他のクラウドAPIに比べて、Salesforceは認証系で多くの情報を求められます。
私も、結構ハマりました。

現時点（2014年4月）で、databasedotcom gemの日本語資料はほぼ皆無なので、ハマったら、素直に英語資料を読んでいくのがいいと思います。

次回は、Salesforce APIとRailsを使って、他のクラウドサービスと連携してみたいと思います。

お楽しみに！

## サンプルコードのダウンロード
上記のサンプルコードは、Githubよりダウンロードできます。

[https://github.com/fuji3zpg/salesforce_api_with_client](https://github.com/fuji3zpg/salesforce_api_with_client)

## API資料
* [https://github.com/heroku/databasedotcom](https://github.com/heroku/databasedotcom)
* [https://help.salesforce.com/apex/HTViewHelpDoc?id=connected_app_create.htm&language=ja](https://help.salesforce.com/apex/HTViewHelpDoc?id=connected_app_create.htm&language=ja)
* [Accessing Salesforce Data from Ruby](https://developer.salesforce.com/page/Accessing_Salesforce_Data_From_Ruby)