Help us understand the problem. What is going on with this article?

Rails4のActiveResourceでRedmine APIを利用する

More than 3 years have passed since last update.

Hamee Advent Calendar 2015の21日目です。

はじめに

Railsで開発ツールを作る過程でAPIを叩くのにActiveResourceを使ったのでその紹介をしようと思います。
今回はRedmine APIを利用します。

環境

Mac OSX 10.10.3
Ruby 2.2.3
Rails 4.2.4

ActiveResourceの概要

ActiveRecordでDB操作を行うのと同じような書き方でREST APIを利用できます。
JSON等のレスポンスをオブジェクトに変換したりといったこともActiveResourceがやってくれます。
Rails4ではコアから除外され、Gemとして提供されています。

Redmineのテスト環境を準備する

http://m.redmine.org/hostings/new
上記リンク先でRedmineのテスト環境を作ることができます。
今回はこの環境のAPIを利用します。

Redmine APIを叩いてみる

URLを設定する

class Issue < ActiveResource::Base
    self.site = 'http://XXXX.m.redmine.org'
    self.headers['X-Redmine-API-Key'] = 'XXXX'
    self.format = :xml

    #Basic認証を行うなら
    self.user = ''
    self.password = ''

    #siteの後に続くパス
    self.prefix = ''
end

ActiveResource::Baseを継承することでAPI接続を行うクラスを作成することができます。
self.siteでアクセスするURL、self.headersでリクエストヘッダにRedmineのAPIキーを指定しています。
今回は使用しませんが、ActiveResourceはBasic認証もサポートしています。

ActiveResouceによって内部的に作られるアクセス先にURLは、
#{site}#{prefix}#{クラス名の複数形}にidや拡張子をつけたものになります。
例えば上記のIssueクラスならhttp://XXXX.m.redmine.org/issues.xmlやhttp://XXXX.m.redmine.org/issues/1.xmlといった感じです。

formatはJSONとXMLを指定できるのですが、JSONにするとオブジェクトとJSON間の変換がうまくいかないのか、チケットの更新などができませんでした。
なぜ失敗するのか分かってないので、調べてみようと思います。

チケットを取得して更新する

各クラスの親としてURLの設定だけしたBaseクラスがあるものとします。

class Base < ActiveResource::Base
    self.site = 'http://XXXX.m.redmine.org'
    self.headers['X-Redmine-API-Key'] = 'XXXX'
    self.format = :xml
end

findでオブジェクトを取得して、プロパティの値を変更してsaveというActiveRecordでDB操作を行うのと同じ感覚でAPIを利用できます。

class Issue < Base
end

#全件取得
Issue.find(:all)

#チケットIDが1のチケットを取得してタイトルを変更
ticket = Issue.find(1)
ticket.subject = 'hoge'
ticket.save

プロジェクトメンバーを取得する

prefixを利用する場合の例としてプロジェクトメンバーの一覧を取得してみます。
下記の例だとhttp://XXXX.m.redmine.org/projects/hoge/memberships.xmlにアクセスします。
hogeの部分がプロジェクト名です。

class Membership < Base
    self.prefix = '/projects/' + 'hoge' + '/'
end

Membership.find(:all)

終わりに

なにかしらのAPIを利用するときには良さそうなGemがなかったりで自分で実装することになったら、ActiveResouceを使うと簡単にAPIが利用できて良さそうです。
別の記事で開発ツールのほうにも触れられたらなと思います。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした