🙆
【Rails】Firestore に値を格納する
環境
- Rails: 6.1.0
- Ruby: 2.7.2
事前準備
公式ドキュメントにしたがって Cloud Firestore データベースを作成する。
手順
- Gemfileに
gem "google-cloud-firestore"
を記述 bundle install
- 認証設定
Tips
認証設定
ドキュメント記載通りFirestoreへ接続するための認証を設定する。方法は、
- 環境変数としてセットする
- 手動でセットする(今回自分が使ったもの)
のどちらか。どちらも設定しないで接続しようとすると、Could not load the default credentials. Browse to (RuntimeError)
が発生する。注意点としては、環境変数としてセットすると、それがデフォルトになるらしい。なのでデフォルト以外の環境へアクセスしたい場合は、手動でセットする必要がある。脳死で環境変数を設定すると、思わぬ事故が起こるかも(?)
今回は手動でセットしたの。やり方は以下の通り
- コンソール画面から使用したいプロジェクトを選択
- プロジェクトの概要横にある歯車マークからユーザーと権限を選択
- サービスアカウント > Firebase Admin SDK > 新しい秘密鍵の生成 > 生成されるjsonファイルを任意の場所におく(特段理由がなければRails.root配下でいいかと)
ここまで出来たら、後はコードを書くだけ。以下コード例
hoge.rb
require 'google/cloud/firestore'
class Hoge < ApplicationRecord
def write
firestore = Google::Cloud::Firestore.new(project_id: 'ダウンロードしたjsonファイルに書かれているproject_id', credentials: 'ダウンロードしたjsonファイルのパス') # firestreインスタンスを作成
doc_ref = firestore.doc("user/admin") # 保存先のパスを指定
doc_ref.set(id: User.id, name: User.name) # 値を書き込む
end
end
(credentialsのファイルパスは、File.new('ファイル名.json').to_pathで指定した。本当はRails.rootを使いたかったけど、なぜかうまく読み込めなかった。。。)
ちなみに環境変数を設定している場合、引数のcredentials
は必要ない。また保存先のパスは、書き込み時にそのパスがなければ自動で作られる。値の型も自動で設定される。
実行するとFirestoreのコンソール上でも値が格納されているのが確認出来るはず。
一応読み込みの例も以下に示す。
hoge.rb
def read
firestore = Google::Cloud::Firestore.new(project_id: 'ダウンロードしたjsonファイルに書かれているproject_id', credentials: File.new('ダウンロードしたjsonファイル名').to_path)
doc_ref = firestore.doc("user/admin") # 読み込み先パスを指定
document = doc_ref.get
puts document.document_id
puts document.data[:id]
puts document.data[:name]
end
まとめ
鍵ファイルをどこから作成するのかわからなかったのと、ファイル読み込みもがうまく出来なくて結構苦戦した。でも一回設定してしまえば、後は問題ないと思う。
参考
Discussion