REST API: membership に対する find(:all)について

858 views
Skip to first unread message

Tetsuro KITAJIMA

unread,
Mar 7, 2013, 5:36:49 AM3/7/13
to redmine-...@googlegroups.com
To: redmine Users ML

お世話になっております。北島です。

先日、Redmine APIからauth_source_idを叩こうとした件については、そのようなAPIを提供するPluginの実装に成功しました。
職場の社内システムで使うためのredmine pluginではありますが、社内の独自構成に左右されるものではないのでgithubあたりに上げて公開できないか検討してみます。

Redmine APIをActiveResource経由で叩くアプリを書いていて、membershipを叩こうとしたところ、すべてのmembershipをまとめて取る方法が見当たらないことに気づきました。

やはりこれもpluginを作るしかない、ということでしょうか。

以下、説明のためにサーバ名を http://redmine/, redmineが置いてあるパスを/opt/redmine/ とします。

例えば User.find(:all) と叩くと、
をとりにいって、XMLをパースしているようです。

で、Membership.find(:all)と叩くと
http://redmine/memberships.xml
をとりに行っていて、redmineのAPI Documentに存在しないものをとりに行っているので、エラーになるのは当たり前のことではあります。

が、Membership.find(1) などを叩くと
を見に行っているので、routeとしてmembershipは存在するように思います。

出力から見る限り、
/opt/redmine/app/views/members/
を見ているようですが、ここにはindex.api.rsb があります。

/opt/redmine/app/views/members/index.api.rsbは
http://projects/<project name>/memberships.xml
を提供しているのかな?

というところまで調べたところで、手が止まっています。
アドバイスをお願いできますでしょうか。

--
北島 哲郎(きたじま・てつろう)
e-mail: tet...@amanogawa.to
織姫 URL:http://www.amanogawa.to/

nobu_toyofuku

unread,
Mar 10, 2013, 6:14:38 AM3/10/13
to redmine-...@googlegroups.com
  豊福です。

2013年3月7日木曜日 19時36分49秒 UTC+9 きたじま:
先日、Redmine APIからauth_source_idを叩こうとした件については、そのようなAPIを提供するPluginの実装に成功しました。
  ...
githubあたりに上げて公開できないか検討してみます。

 ぜひぜひ。

が、Membership.find(1) などを叩くと
を見に行っているので、routeとしてmembershipは存在するように思います。

REST API の仕組みをよく知らないのですが単に Membership という
名前から http://redmine/memberships/... というurl を生成して
いるだけではないでしょうか。Hogehoge.find(1) としても
http://redmine/hogehoges/1.xml にアクセスしているようです。
 
/opt/redmine/app/views/members/index.api.rsbは
http://projects/<project name>/memberships.xml
を提供しているのかな?

config/routes.rb に
  resources :projects do
    ...
    resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :create, :update, :destroy] do

とあるので members_controller.rb を経由して
app/views/members/index.api.rsb にたどりついているのでしょうか。

「redmine membership.find」でググって見つけたコードを参考に

  require 'rubygems'
  require 'active_resource'

  class Membership < ActiveResource::Base
    self.site = 'http://redmine/projects/:project_id'
    self.user = ...
    self.password = ...
    self.format = :xml
  end

  mss = Membership.find(:all, :params => {:project_id => <プロジェクト識別子>})
  mss.each {|m| p m.user}

でやってみたらプロジェクトのメンバが取れました。
(これが定番の書き方かどうか知りません)
---
 

Tetsuro KITAJIMA

unread,
Mar 10, 2013, 9:04:49 PM3/10/13
to redmine-...@googlegroups.com
To: redmine-users ML (specially: 豊福 さま )

北島です。いつもお世話になっております。

2013年3月10日 19:14 nobu_toyofuku <nobu.t...@gmail.com>:

「redmine membership.find」でググって見つけたコードを参考に

  require 'rubygems'
  require 'active_resource'

  class Membership < ActiveResource::Base
    self.site = 'http://redmine/projects/:project_id'
    self.user = ...
    self.password = ...
    self.format = :xml
  end

  mss = Membership.find(:all, :params => {:project_id => <プロジェクト識別子>})
  mss.each {|m| p m.user}

でやってみたらプロジェクトのメンバが取れました。
(これが定番の書き方かどうか知りません)

私自身も、先日メールを発信した後試行錯誤して、だいたいこのような感じのコードに辿りつけました。
が、このMembershipクラスを使ってAPIを叩くと、API仕様書から考えるとgetとpostはできてもdeleteができない可能性がありそうです。

もう少し手を動かして結果出してみます。
もうしばらくおつきあいいただけますと幸いです……よろしくおねがいします!

#ふだんはCの仕事が多く、社内向けに小さなアプリを書く仕事だとC#が多かったので、Rubyで(数十分で書ける以上の)ちゃんとしたコードを書くのは今回が初めてで、そういう意味でも苦戦中です。

nobu_toyofuku

unread,
Mar 11, 2013, 5:10:06 AM3/11/13
to redmine-...@googlegroups.com
  豊福です。

2013年3月11日月曜日 10時04分49秒 UTC+9 きたじま:
このMembershipクラスを使ってAPIを叩くと、API仕様書から考えるとgetとpostはできてもdeleteができない可能性がありそうです。

 「Rest Memberships」
http://www.redmine.org/projects/redmine/wiki/Rest_Memberships
を参考に先のコードの
のところを
  self.site = 'http://redmine'
に変えて
  Membership.delete(<メンバシップID>)
でどうでしょう。
---

Tetsuro KITAJIMA

unread,
Mar 11, 2013, 5:41:21 AM3/11/13
to redmine-...@googlegroups.com
To: Redmine-users ML (Specially 豊福さま )

北島です。いつもお世話になっております。
本件、ActiveResourceのドキュメントを読んでみました。

http://api.rubyonrails.org/classes/ActiveResource/Base.html

--引用--

class PersonResource < ActiveResource::Base
  self.site = "http://api.people.com:3000/"
  self.element_name = "person"
end

--引用終わり--

こんな方法で、ActiveResource::Baseを継承するクラスの名前を変えざるを得ない場合にも対応できるのですねぇ。
これを使えば、self.site2種類に対応するMembershipクラス2種類を作れることがわかりました。

というわけで、今日の時点でredmineのAPI絡みの壁は多分全部越えられたと思います……お世話になりました!
あとは社内環境に合わせてロジックを作りこんでいく作業なので、こちらで相談できることや公開できることはなさそうです。

以上、失礼いたします。




2013年3月11日 18:10 nobu_toyofuku <nobu.t...@gmail.com>:

--
このメールは Google グループのグループ「Redmine Users (japanese)」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、redmine-users-...@googlegroups.com にメールを送信します。
このグループに投稿するには、redmine-...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/redmine-users-ja?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

nobu_toyofuku

unread,
Mar 11, 2013, 6:10:10 AM3/11/13
to redmine-...@googlegroups.com
  豊福です。

2013年3月11日月曜日 18時41分21秒 UTC+9 きたじま:

こんな方法で、ActiveResource::Baseを継承するクラスの名前を変えざるを得ない場合にも対応できるのですねぇ。
これを使えば、self.site2種類に対応するMembershipクラス2種類を作れることがわかりました。

  self.site を書き換えずにできるかが問題だったのですね。
先ほどのメールは釈迦に説法な内容でお恥ずかしい。
(おかげさまで自分にとって REST API の勉強になっています)
まとまったら完成形を見せていただけると嬉しゅうございます。
---

Tetsuro KITAJIMA

unread,
Mar 12, 2013, 1:38:28 AM3/12/13
to redmine-...@googlegroups.com
To: Redmine-Users ML (specially 豊福さま )

北島です。いつもお世話になっております。

これ、self.siteを書き換えずにやれるかどうか、というより「self.siteを途中で書き換えても、最初に設定した値が有効になる」という現象のような気がします。
ActiveResource::baseのソースコードを読んでみたところ、dup.freezeなどと書いてあったので、何らかの形で最初に設定した値を固定する仕組みが入っているのかもしれません。

もはや完全にActiveResourceの話になりましたが、私自身も今回でRedmineのAPI, そしてrubyのいい勉強になりました。
ちょうどこのメールを書きながら自動テスト仕掛けたところ無事に通ったので、いよいよ本格的に社内環境とすりあわせていく作業にとりかかれそうです。

以上、ありがとうございました!

P.S. 各種ノウハウやプラグインの正式公開、パッチ投稿について社内上層部で検討していただいたところ、それなりに良い意見をもらえました。調整できそうです。



2013年3月11日 19:10 nobu_toyofuku <nobu.t...@gmail.com>:

--
このメールは Google グループのグループ「Redmine Users (japanese)」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、redmine-users-...@googlegroups.com にメールを送信します。
このグループに投稿するには、redmine-...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/redmine-users-ja?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 
Reply all
Reply to author
Forward
0 new messages