5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HameeAdvent Calendar 2015

Day 21

Rails4のActiveResourceでRedmine APIを利用する

Last updated at Posted at 2015-12-20

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が利用できて良さそうです。
別の記事で開発ツールのほうにも触れられたらなと思います。

参考

5
6
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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?