Bubbleのチュートリアル２：Building a sign-up system

# はじめに
Bubbleというノーコード/ローコードでアプリを作るサービスがあり、ちょっと言葉に癖があったりするので、チュートリアルをやってみる記録です。Bubble用語は、`Bubble`のように網掛けします。
なるべく細かくキャプチャしていくので、見るだけでもBubbleってこうやるんだと感じていただければ。

https://bubble.io/

チュートリアルをやってみた記事
1. [Saving data](https://qiita.com/yo16/items/d77a5cf8df18419b079e)
    - 位置情報をDBへ登録して、地図にマーカーを表示
2. **Building a sign-up system** ＜＜今回＞＞
    - ユーザー登録とログイン、ログオフ

# チュートリアルの記録
## チュートリアルを選択
ログイン後のトップページ
＞左メニューのAcademy
＞Learn your way
＞By watching
＞Interactive lessons
＞Building a sign-up system

今回は、sign-upということで、アプリを使うユーザー登録ですかね。ログインまで含まれそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/8b2361e4-956b-9480-cb19-e00d3b39fb27.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/3cc73823-5fd2-4cad-a750-184fc3fb7e1b.png)
サインアップ（登録）、ログイン、ログアウトまでですね。Googleアカウントでログインとかfacebookアカウントでログインとかは、ソーシャルログインと言われますが、それは今回は含まないとのこと。

## 登録フォームを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/aa2c1979-aaa0-5e6e-5651-5a439bc6f1b0.png)
indexページで、sign-up form（登録フォーム）を作って、メールとパスワードを登録。メールアドレスが、ログインIDになるような形式かな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/2b251943-c44f-21a6-a2f7-201b88d1c32d.png)
左のペインの`Element platte`から`Input`を選択。

Emailを入力させる位置へドラッグ（キャプチャ忘れ）


そういえばここで少し脱線して、プロパティダイアログについて。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/cff6c5c4-2d39-5246-4e94-2639a6c04619.png)
Bubbleのデフォルトでは、プロパティウィンドウはフローティングで画面に被さるように出るんですが、私はそれがすごく嫌なので、画面右ペインに固定しています。（UI設計ができる統合開発環境って大体そうじゃない？？）
そのやり方は、上の`View`メニューの下の方にある、`Lock Property Editor`にチェックを入れます。

戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/0ecf4095-d17b-e915-6678-b320d5b341d2.png)
プロパティを入れていきます。がその前にプロパティダイアログの一番上のタイトル＝`Element`名が、"Input Email"になってるけど、これはチュートリアル先生が勝手に入れたところ。自分で作るときは、ここを適切に名前を付ける必要あり。こういうのやめてほしい。

で戻りまして、
プレイスホルダーに、Emailと入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/355717d0-d93d-4b0b-7484-957266c2ac0c.png)
それをパスワードでも同じことをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/68d83d24-6071-ce95-018a-a20a6aaf5360.png)
１つ目の`element`の下に２つ目の`input`を置いて、ユーザーにパスワードを入力させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/bc1b39e8-d9ba-1030-59d6-c0d76f264ea2.png)
プレイスホルダーに、"Password"と入れる。（また`Element`名が自動的に、"Input Password"に変えられている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/4c347452-1a6d-d624-a001-f4a37c5edcf6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/bfe312a3-fb62-c587-d6a6-f9e15cb728a7.png)
登録（sing-up）とログイン（login）をどちらもできる画面にするってことですね。
よくあるのは、ログイン画面が最初に出て、まだ登録されていない方はこちらという小さな文字のリンクがあってそこをクリックすると、登録画面に飛ぶような形。そうしないと、ログインしようとして誤って登録ボタンを押すときに、ユーザーも処理もややこしいことになります。まぁ今は練習だから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/b237aee3-b389-fcae-53b2-8f863869ae16.png)
ボタンを置く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c057642f-7343-0915-37b1-4093c92337cc.png)
（また勝手に`entity`名が"Button Singup"に書き換えられている。今後もずっとそうだけど、省略）
ラベルを、"Sign up"にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1c6be0d7-6eba-dc0a-6b77-6eed10a7a0b0.png)
ログインボタンも同じように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c9decd26-3e44-71ee-490b-2f2468bc40d3.png)
ラベルを、"Log in"にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/7a634af0-62b2-0f9c-ca38-dcd21ce0595d.png)
"Sign up"のから、`workflow`の登録を開始！
"Start/Edit workflow"ではなく、"Add workflow"ボタンだけど。

## Sing upボタン押下時の`workflow`を登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1d7e7990-8a8e-aad2-4289-ac9570a757b4.png)
"Add workflow"のボタンを押すと、`Workflow`の画面に飛びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/0b0e7621-d034-6416-d6d1-3aed21d1937f.png)
`Acount`の"Sign the user up"を選ぶ。こういう道具がそろってるのはいい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/58f9ac12-4e30-1293-6b42-0957e4706e9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/a9a3b3a8-f0ed-f412-5f2c-799d051db8d8.png)
メールとパスワードをどこから取得するか、プロパティで設定。
"Sign the user up"に、最初から"Email"と"Password"のプロパティを設定させるのは、ちょっと違和感があるかも。アプリによっては、"Email"でログインしない（ユーザーIDでログインする）ケースもありそうな気がするから。でもまぁいいや。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/6a6b7908-f29b-ea7d-a01c-774f0e809997.png)
"piece by piece"＝少しずつ（英語講座）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/436838ff-2b15-ce7e-da9e-fb5a0f4df159.png)
`Elements`（画面に置いたアイテム）から、"Input Email"（勝手に名付けられていた）を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/0c63623e-8b42-4113-412e-65a41cb41494.png)
の、Value（値）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/0f8f06fe-bb5f-0a37-a377-b47d19e4886b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/583be37c-10a7-6890-425c-8b8c842ded92.png)
パスワードも同じようにやって、この状態。

"Sign the user up"という道具は、"User"というテーブル（`thing`）にレコード（`entry`）が追加され、それが`Current User`になるということですね。テーブルにレコードが追加の話は上に書いてないけど、確認してそうなってました。

## Log inボタン押下時の`workflow`を登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c2c555c9-b6e2-9d74-4b99-5a8ed8e68917.png)
今度はログインボタン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/ab7e8a48-690d-9dec-db01-e012c9005e63.png)
`Elements`の`An element is clicked`。あれ、さっきこれやったっけ？という話ですが、今のこの操作は、トリガーの定義です。
`Design`画面のボタンから、"Add workflow"で始まると、このトリガーのところは自動でそのボタンがクリックされたときってなるので、この作業は不要なんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/ce5b5c71-7e21-127f-8309-4e65b137a391.png)
無事、"An Element"がクリックされたとき、というトリガーが完成。まだ"An Element"が何なのか定義してないので、次から。
今作っている`Workflow`の正方形のハコの位置が左端へ移動しました。"Sing up"の処理は右にずれた。これはわかりづらい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/adc47c27-d780-b5c5-8bfb-e36715201951.png)
"Element"で"Button Login"を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/802b3e3f-efb5-32c3-4c95-ef858b66c92e.png)
"Button Login"をクリックしたときのトリガーって変更されました。お隣は、上で登録した"Button Signup"を押したときの処理。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/ea87e5ad-2917-cd56-fe6b-d5b3d68f84d1.png)
"Account"＞"Log the user in" で、ログイン処理。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/e71d65ff-d268-3280-bbd9-5c0962ec33ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/67f49fe2-a74d-e20b-68f8-b75539ae77bc.png)
最後の１文の意味が分かりづらいけど、Signupと同じようにやればいいんですねと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/4c49b1aa-05be-5d9d-f3ca-d07374a72d70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/5290913d-3361-173f-d32b-311fa3ab02b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1ff22727-5e7a-355e-801a-9916c3f4e957.png)
これで処理は終わり。この２つ目の処理のプロパティで、"Stay logged in"に"yes"となっていて、ログインしたらそのままログインしっぱなしにっててOK。それこそログイン。

で、左上のアイコンから`Design`に戻るんですね。
このメッセージでいうグループは、おそらくボタンを囲む線みたいなもの、HTML的にいうと、&lt;div&gt;で囲む、みたいなものかと。

## メールアドレスを表示
ログインしている場合は、メールアドレスを表示する仕組みを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/11a67dc5-fe74-5f24-1098-89863c36da15.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/cb57eb0c-7243-e9b4-3baf-90961b7e3c9e.png)
`Group`を選択して配置。正方形のハコができた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/25daab12-3712-80b0-391e-082fb4134da7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/d219c440-6d90-274d-4861-c2ac73315d42.png)

グループを置いた瞬間は"Group A"という名前だったけど、いつの間にか"Group logged in"に変更されている。もうー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/88b12497-c453-e068-caa6-d2b3c2829574.png)
グループが選択されている状態で、左ペイン下部の`Visual Elements`の`Text`を選択すると、グループの中に配置される。左ペイン上部の`Element Tree`には、"Group Logged In"の配下に"Text A"ができていて、中に作成されたということを示している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/2ea05951-36c3-3986-b20b-d5c9e38a98df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/8c13dba2-41f9-0283-17f4-9a4225daccf6.png)
"Insert dynamic data"とは・・？と思って"...editme..."のあたりをクリックすると、水色の"Insert dynamic data"が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/fe4e4d3d-284a-bd44-5fe9-7f8a49222856.png)
そうするといつものリストが出て、その中に"Current User"があるので、選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c34bb1e2-b152-b818-c634-d81c5ec0a310.png)
`'s email`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c073f5c1-01f8-4943-e4f5-bfb24cc6d90c.png)
Fantasticなことに、ログインされてれば、ここに表示されますよと。
Fantasticっていう単語、英語圏だとよく使うのかな。私のようなしょぼい英会話能力者の心理としては、使おうという発想が出てこないけど知っている、という単語。

## ログアウトボタンを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1b469fe7-f9a0-2cc6-d6b7-753bf65a6dea.png)
最後に、ログアウトボタン。
`Button`を選択して配置。これも、"Group Logged In"の中に作るみたい。ログイン中でしかできないからかな。あ、あとで、このグループの表示条件をログイン中のみ、とかするのかも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/7d89cb95-8bd5-a0e6-fe9c-656deff73fde.png)
グループ内にできました。
テキストより下に置きたかったけどまぁいいか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/b380c953-240b-45e2-5ffa-1a3f72f84dff.png)
キャプション（`Label`）に"Log out"って書く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/79b29f84-4127-5207-0bea-47e4f839d9ad.png)
で、`workflow`の作成。このパターン、慣れてきた。

## ログアウトボタン押下時の`Workflow`を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/e88140d1-925c-f546-e203-7a288466c838.png)
微妙な位置に、ログアウトボタンの処理が作成されていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/31e8f490-7797-a374-2a49-d7a9cb40306c.png)
"Click here to add an action"で、"Account"＞"Log the user out"。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/5e2f7767-7bfb-e150-8297-3ce1670ccfe4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/ed34f341-ac2a-08a5-9ef4-4c6683ccfe3f.png)

あら、これで終わり。確かにログアウトの処理って、あんまりないですね。そういえばログインしたときは、そのユーザーが`Current User`になるという
ことだったけど、ここでは`Current User`を消す、という内部処理が走るのでしょう。

次はやはり、グループの表示ON/OFFの模様。

## グループの表示ON/OFF機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/5899642e-056a-2291-3a54-472557c2a355.png)
あれ！？`Design`側で表示条件を設定するのかと思ったら、`Workflow`でやるようです。"ログインした"というイベントをトリガーに。
登録にしろ、ログインにしろ、どちらも"ログインした"というトリガーで動いてほしいからですかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/4b431343-4ecd-80c0-e778-024df7dd8f88.png)
"General"＞"User is logged in"をトリガー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/fd275a20-6b76-a5ee-cc2f-5da3bf7c9373.png)
ログインしたら、`Element`を"Show"します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/506f9bbe-92d9-36db-d4e3-4846abb81a61.png)
どの`Element`かというと、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/5f57656f-bb8b-145a-cc74-0b70f05741e6.png)
"Group Logged In"です！（吹き出しでUIのプレビューが出る。気が利いてる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c0f2efce-f508-350b-3761-26f92ae11239.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/afc9792d-eb53-b1f7-9568-49a67934fc0e.png)
次はログアウトしたら消すよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/9aedb0a8-286b-3a93-b4d5-c15325b492de.png)
同じことやるのか、まぁ１手だからいいかと思ってたら、パッと作った。こういうのよくないよ。

完成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/1e29109c-2466-a00b-841e-fbb6dabeb272.png)
ここでボタンを押すと、アプリが消えてしまうのでそーっとプレビュー。

## `Preview`で確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/067d8eaf-0614-a3f9-39e9-b8e7b6138dd2.png)
あれ、ログアウトボタンが見えてる。そうか、ログアウトのトリガーで消すから、初期状態は見えていますね。バグ。初期値で非表示、というプロパティがありそう。

Sign upせず、いきなりLog inしてみたら、なんか考え中みたいになるな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/5ec12205-ece7-86cc-b0b0-7873c6651b90.png)
素直にSign upしてみたら、メールアドレスが表示された。かなり控えめに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c50f7db4-c505-7733-3b0d-9506b4994a73.png)
ログアウトしたら、表示は消えた。そういえばログアウトボタンは消えない。なにか手順を間違えたかも？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/407b6ae8-d3c2-b03f-c6bd-8bc29ccfc146.png)
メールとパスワードを空にする処理は入れてなくて、そのまま残ってるので、そのままログインボタンを押したら、またメールが表示された。うまく動いているみたい。

なんかちょいちょい動きがぎこちないけど、チュートリアルだからまぁいいか。
すでにあるアカウントで登録時にすでに登録していますとか、ないアカウントでログイン時に登録がないとか、メッセージは必要ですね。でもこれはなんとでもなりそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/bd356ed4-6540-a452-8dcc-a0d5e5e3786b.png)
ちなみに、`Data`のレコードは見られなかった。チュートリアル用の環境だから仕方ないですかね。

# おわりに
ということで、どのアプリでも大体必要な、ユーザー登録とログイン、ログアウトの処理でした。キモとなる部分はわかりました。"Account"の中の、SignupとかLoginを使えばいいだけなので簡単。

もし、ノーコードでこういうことができることを知らないエンジニアが、非エンジニアがこの仕組みを作ったことを聞いたら、ちょっと驚くレベルかと。
でも、本番で使うには、もうひと工夫必要。画面遷移とか、登録とログインは分けた方がいいとか。そういうことは、少しは設計や経験がないと、難しいかなぁ。ノーコードと非エンジニアは、単純に結びつくものではないと感じました。

スクラッチ開発でこういうのをやろうと思うと、やっぱ何かとめんどくさいので、ここだけ切り出してほしいくらい。ユーザー情報を登録するためにDBも必要だから、切り出すのは難しいか。

ではよきBubbleライフを。

# Next
次はチュートリアル３に挑戦。
[Bubbleのチュートリアル３：Saving and modifying data](https://qiita.com/yo16/items/449b9e0b15ff76ec9584)