ページの取得と関連するメソッド: NotionRubyMapping 解説 (3)

はじめに

NotionRubyMapping 解説の第3回目です。インテグレーションキーも用意したので、早速ページにアクセスしてみます。今回から、毎回ページを用意してそこで作業を行います。

hkob.notion.site

ページの取得

今回の連載では、NotionRubyMapping の解説を行うということで、Notion API や payload の JSON などの解説はせず、あくまでオブジェクトから見える世界のみを解説していきます。Rails であまり SQL の話などをしないのと同様です。当然、SQL を知っている方がうまく Rails を使えますし、API のことを知っている方が Notion API をうまく使えます。ある程度使ってみたくなったら、API リファレンスを読んでみるといいでしょう。先ほどのデータベースに「ページの取得(3)」というページを作ってみました。公開 URL は以下のようになります。

https://hkob.notion.site/3-cb058e00917e4b2bb6818e1b89fab4b8?pvs=4

早速 irb を起動して、初期設定を行います。

irb
irb(main):001> load "/Users/hkob/bin/nrm_init.rb"
=> true

NotionRubyMapping では Page クラスの find クラスメソッドで Notion ページを取得できます。Rails ではデータベースの主キーである数値 ID を渡しますが、NotionRubyMapping では page_id を渡します。page_id は先ほどの URL の ? の前にある32桁の16進数です。上の例では cb058e00917e4b2bb6818e1b89fab4b8 に相当します。ただし、いちいちこの ID を取り出すのは面倒なので、上の URL をそのまま渡しても自動的に page_id を取り出してくれます。ここでは、以下のコマンドで page を取得してみます。page_idpage_url は文字列なので、 "" でくくってください。

irb(main):002> page = Page.find "https://hkob.notion.site/3-cb058e00917e4b2bb681
8e1b89fab4b8?pvs=4"
=> NotionRubyMapping::Page-cb058e00917e4b2bb6818e1b89fab4b8

NotionRubyMapping::Page のオブジェクトが取得できていることがわかります。

ページオブジェクトに対するメソッド

Rails がデータベースのエンティティを Ruby のオブジェクトに Object-Relation Mapping しているのと同様に、NotionRubyMapping では Notion のブロックを Ruby のオブジェクトに Mapping しています。Ruby のオブジェクトに変換されているので、このオブジェクトにメソッドを送ると Notion のブロックの情報をいくつか取得したり、変更したりすることができます。ここでは代表的なものを紹介してみます。

1. title: ページタイトルを取得

title はページのテキスト情報のみを取得するメソッドです。

irb(main):003> page.title
=> "ページの取得 (3)"

2. parent_id: 親の ID を取得

parent_id はページの親の ID を取得するメソッドです。

irb(main):004> page.parent_id
=> "f50fe9be-119c-41d1-b2e0-b99bbab471a8"

3. parent: 親の Notion オブジェクトを取得

parent はページの親のオブジェクトを取得するメソッドです。

irb(main):005> page.parent
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8

4. created_time: 作成時刻プロパティを取得

created_time はページの作成時刻プロパティを取得するメソッドです。このオブジェクトは inspect を実装していないので、中身のインスタンス変数が見えてしまっていてカッコ悪いですね。時間がある時に直しておきましょう。

irb(main):006> page.created_time
=>
#<NotionRubyMapping::CreatedTimeProperty:0x000000012bc12d08
 @base_type=:page,
 @create=false,
 @json="2024-02-25T11:23:00.000Z",
 @name="__timestamp__",
 @new_name=nil,
 @property_cache=nil,
 @property_id=nil,
 @query=nil,
 @remove=false,
 @will_update=false>

5. last_edited_time: 更新時刻プロパティを取得

last_edited_time はページの更新時刻プロパティを取得するメソッドです。

irb(main):007> page.last_edited_time
=>
#<NotionRubyMapping::LastEditedTimeProperty:0x000000012be1ca90
 @base_type=:page,
 @create=false,
 @json="2024-02-25T11:26:00.000Z",
 @name="__timestamp__",
 @new_name=nil,
 @property_cache=nil,
 @property_id=nil,
 @query=nil,
 @remove=false,
 @will_update=false>

6. page?, database?, block?

page?, database?, block? はそのオブジェクトが page なのか、database なのか、block なのかを聞くメソッドです。今回の場合、page? のみが true を返します。

irb(main):008> page.page?
=> true
irb(main):009> page.database?
=> false
irb(main):010> page.block?
=> false

7. new_record?

new_record? は Rails と同じで Notion 側に存在しない Page オブジェクトである時に true を返すメソッドです。基本的には Page.new で作成したオブジェクトの時 true になります。これは後日解説します。

irb(main):011> page.new_record?
=> nil

8. properties

properties は page のプロパティをまとめて管理する PropertyCache オブジェクトを返します。こちらについては、後日プロパティの解説の時に説明します。

irb(main):012> page.properties
=> PropertyCache

9. icon

icon はページアイコンの内容を示すハッシュを返すメソッドです。このページはアイコンがないので、nil になっています。

irb(main):014> page.icon
=> nil

10. set_icon emoji: a_emoji または set_icon url: a_url

set_icon は絵文字または外部 URL によりアイコンを設定するメソッドです。ただし、オブジェクトの設定をするだけで、後述する save をした時に初めて Notion にデータが送られて変更されます。

irb(main):015> page.set_icon emoji: "1️⃣"
=> NotionRubyMapping::Page-cb058e00917e4b2bb6818e1b89fab4b8

11. save または save dry_run: true

save は上記のようにページ情報を変更した後で Notion データを書き換えるものです。Rails の場合もオブジェクトの内容を変更しても、save するまではデータベースが書き変わりませんでした。NotionRubyMapping もさまざまな情報を変更した上で、save した時に page に関する全ての変更情報を更新します。なお、上級者向けに dry_run: true とすると、Notion API の payload を含めたシェルスクリプトを表示します。iOS などのショートカットアプリの JSON を手書きしたくない人はこちらを使ってください。ちなみに、今回の場合にはこんなスクリプトが表示されます。

irb(main):017> print page.save dry_run: true
#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/pages/cb058e00917e4b2bb6818e1b89fab4b8' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"icon":{"type":"emoji","emoji":"1️⃣"}}'=> nil

page.save とすると Notion のページアイコンが変更されました。

irb(main):018> page.save
=> NotionRubyMapping::Page-cb058e00917e4b2bb6818e1b89fab4b8

保存した後、Notion API はページ情報を返却してくれます。NotionRubyMapping では返却された情報で page オブジェクトの内容を再度アップデートします。このため、ここで page.icon とすると変更されたアイコンの情報が正しく入っていることがわかります(先ほど取得した時は nil でした)。

irb(main):019> page.icon
=> {"type"=>"emoji", "emoji"=>"1️⃣"}

おわりに

取り急ぎ、ページに関するメソッドを紹介してみました。ページの作成やページ内のブロックの追加などもありますが、それらは後日解説していきます。

Page クラスに関するマニュアルはこちら → hkob.notion.site

NotionRubyMapping解説