ruby-trelloでTrelloを美味しくいただくサンプルを少々

# 前置き
[前回の記事](http://qiita.com/yasushiito/items/51844e8369ab05b8bae1)でRubyからTrello APIを使う操作が可能になりました。とはいっても、ボードを作るサンプルだけではさすがに実用性がありません。そこでいくつかの小さなレシピを作ってみることにしました。

# 事前調査
先行事例は意外と少ないのでドキュメントと格闘することになります。

ruby-trello(ライブラリ)のリファレンスがこちらになります。

[Ruby wrapper around the Trello API](http://www.rubydoc.info/gems/ruby-trello/Trello)

ボードやカードをrubyらしくオブジェクトとして操作できます。restの通信もうまい具合に隠蔽してくれます。大抵の要求はこいつが満たしてくれることでしょう。最悪の場合でも、クライアント(Trello.client)から生に近いAPIを発行できるので何とかなります！……とは言ってもTrello APIってば、あまりにも豊富なオプションがあるので、ある程度は仕様を理解していないとつまずいたりします。APIの公式ドキュメントは一通り目を通しておいた方が良いでしょう。

[Trello developer API reference](https://developers.trello.com/advanced-reference)

# Rubyスクリプト
ドキュメントを読め、読めと言われても、時間ばっかりかかって効率あがらないし、手っ取り早く成果が欲しいよねーーーってことでレシピ集です。

まずは自分探しから

```rb:find_me.rb
me = Trello::Member.find('me')
puts me.name
```

自分がこしらえたボードをリストアップできます。[詳細](https://developers.trello.com/advanced-reference/member#get-1-members-idmember-or-username-boards)

```rb:find_my_boards.rb
me.boards.each do |b|
  puts b.name
end
```
リストアップはフィルタをかませて絞りこむことができます。この例では、スターをつけたボードだけが出力されます。[詳細](https://developers.trello.com/advanced-reference/member#get-1-members-idmember-or-username-boards-filter)

```rb:find_my_favorite_boards.rb
me.boards(filter: 'starred').each do |b|
  puts b.name
}
```

ボードのID（urlのhttps://trello.com/b/ の後ろの英数字を組み合わせた文字列）がわかっている場合は、IDから直接取得できます。

```rb:find_board_by_id.rb
b = Trello::Board.find('b0ardID')
puts b.name
```

ボートにぶら下がるカードを取得します。

```rb:find_cards.rb
b.cards.each do |c|
  puts c.name
end
```

フィルターを使って公開中のカードだけ取得します。[詳細](https://developers.trello.com/advanced-reference/board#get-1-boards-board-id-cards-filter)ArgumentsのShowボタンを押して

```rb:find_cards_with_filter.rb
b.cards(filter: 'open').each do |c|
  puts c.name
  puts c.closed?
end
```

ボードをアーカイブします。カードも同様です。

```rb:close_board.rb
b.closed!
```

アーカイブしたボードを元に戻します。

```rb:reopen_board.rb
b.closed=false
b.save
```

ボードのスターを判定します。理由はわかりませんがスターはreadonlyです。APIにもON/OFFに該当する機能がありませんので、GUIから操作するしかないようです。

```rb:board_star.rb
b.starred?
```

カードをコピーします。コピー元のIDだけでなく、コピー先のリストIDも必要です。省略した時はコピー元のリストでいいと思うんですけどね。[詳細](http://www.rubydoc.info/gems/ruby-trello/Trello%2FCard.create)

```rb:copy_cards.rb
b.cards.each do |c|
  new_card = Trello::Card.create(source_card_id: c.id, list_id: c.list_id)
end
```

もちろんリストIDを指定すれば、ほかのボードにもコピーできます。

```rb:copy_cards.rb
to_list = Trello::List.find('t0ListId')
b.cards.each do |c|
  new_card = Trello::Card.create(source_card_id: c.id, list_id: to_list.id)
end
```

# おまけ
ruby-trelloのオブジェクトはRailsのActiveRecordみたいに親子関係をたどって行けます。

```rb:relation.rb
board.cards
card.list.board
```

これは[Trello::BasicData](http://www.rubydoc.info/gems/ruby-trello/Trello/BasicData)で[many](http://www.rubydoc.info/gems/ruby-trello/Trello%2FBasicData.many),[one](http://www.rubydoc.info/gems/ruby-trello/Trello%2FBasicData.one)の関係を定義しているからで、[Trello::Board](http://www.rubydoc.info/gems/ruby-trello/Trello/Board),[Trello::Card](http://www.rubydoc.info/gems/ruby-trello/Trello/Card)などはこれを継承しているからです。

うまいことオプションを渡せない時は[Trello::Client](http://www.rubydoc.info/gems/ruby-trello/Trello/Client)を使うと良いかもしれません。[get](http://www.rubydoc.info/gems/ruby-trello/Trello%2FClient:get),[find](http://www.rubydoc.info/gems/ruby-trello/Trello%2FClient:find)だけでなく[post](http://www.rubydoc.info/gems/ruby-trello/Trello%2FClient:post)も[put](http://www.rubydoc.info/gems/ruby-trello/Trello%2FClient:put)もあります。パスにパラメータを渡す形式なので柔軟に指定できると思います。