Bullet TrainでRailsの開発が何倍も速くなりました！

# Bullet Trainとは
[Bullet Train](https://bullettrain.co/)とはRailsをベースにして、多くのサービスに普段ついているユーザー登録・認証やAPI関係の機能など、ビューのテンプレートなどを、新しいアプリを作った時点で全部提供してくれる、ウェブサイトを作るためのSaaSフレームワークです。

開発自体がRailsとほとんど変わりません。普通の線路(Rails)より新幹線(Bullet Train)のごとく、サイトの開発をとても速くしてくれるフレームワークですので、皆さんにぜひ一度でも使ってみていただきたいと思います。

# 「メニューはお任せ」
Railsを普段やっている人であれば「[メニューはお任せ](https://rubyonrails.org/doctrine#omakase)」という概要について聞いたことがあるでしょう。
> How do you know what to order in a restaurant when you don’t know what’s good? Well, if you let the chef choose, you can probably assume a good meal, even before you know what “good” is. That is omakase.

> レストランに食べに行く時、メニューで何が美味しいか分からなければ何を頼んだらいいか迷いますよね。ただし、もしシェフに任せてオススメのメニューを注文したら、何が美味しいか分からなくても、シェフがオススメするものは美味しいだろうと予想がつくと思います。それは「お任せ」です。

要するに、Railsの「設定より規約」よりもうちょっと具体的で、フレームワークを提供している人にどのツールやライブラリーなどを使うか任せるイメージです。

そして、Bullet Trainを作った[Andrew Culver](https://twitter.com/andrewculver)は曰く、もしRailsは「メニューはお任せ」なのであれば、Bullet Trainは食事だけでなく、どのホテルに泊まるかとか、観光は何を見に行くかとかまで、一番オススメの旅行のスケジュールを組み立ててくれるフレームワークです。

# 試しに新しいアプリを作りましょう

ザッとどんな感じなのか見ていきたいと思います。
### 事前準備
始まる前に下記のものはインストールしていることを確認してください。
（3月29日現在からはバージョンが変わる可能性あり）
1. Ruby 3.1.1
2. Node v16.14.0
3. PostgreSQL
4. Redis
5. Sidekiq

ローカルの環境が整ったら次のコマンドで新規のBullet Trainのアプリを作りましょう:
```shell
$ git clone git@github.com:bullet-train-co/bullet_train.git your_new_project_name
```
`your_new_project_name`の代わりに好きな名前を書いてください。

次はディレクトリーに入りましょう：
```shell
$ cd your_new_project_name
```
本来は次に`bin/configure`を実行してGitHubで新しいレポジトリーを作くるべきなのですが、軽く紹介する目的で本記事を書いていますので、まずローカルで立ち上げてみたいなので次のコマンドを実行してください:
```shell
$ bin/setup
```

`bin/setup`の手順に従った後、サーバーを立ち上げましょう。
もし下のコマンドでエラーが出てプロセスが終了したら、別のタブで`$ redis-server`を打ってからやり直してみてください：
```shell
$ bin/dev
```

以上。

## ユーザー登録やログイン

`https://localhost:3000`にアクセスすると下の画面が出てきます:
![First page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/338c704e-784c-c92c-129c-b9e4201052fd.png)

見ての通り[devise](https://github.com/heartcombo/devise)はもうすでに実装されてあり、Tailwindを使ってのビューも準備万全。
では、次に「Don't have an account?」を押してアカウントを作りましょう:
![Sign up 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/49471b75-bcf9-89ed-b40b-769127086103.png)

この時点でメールは自動的に送られて新しいタブで出てきますが、それを一旦おいといて登録を続けましょう。メールアドレスとパスワードを設定したら、次の画面でチーム名も必須項目なのでデフォルトの「Your Team」のままにします：
![Sign up 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/5fae04c7-4498-e204-77be-4106789b58f6.png)

「Next」を押したら、ダッシュボードに移転されます。

## チームの仕組みはもうすでに出来上がっています
この画面でユーザー登録の時に作ったチームの名前を確認できます：

![Dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/df6d17de-88fe-be46-01a3-c7c327a6e1a5.png)

しかも、[CanCanCan](https://github.com/CanCanCommunity/cancancan)を使ってのAdmin、役割のロジックももう出来上がっています。自分が「Your Team」のメンバーになっていることを、左の`Team Members`のボタンを押して確認しましょう。

## Team, Membership, Userモデルのデザイン
![Team Members.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/2ce7e883-9267-99e8-ab14-255055efef9a.png)
データベース設計の面でここは結構大きくて、もうどういう風にユーザーをチームに属させるかを考えなくていい構造になっています。具体的なことはここで割愛しますが、なぜこのデザインにしたかは[Bullet Trainのブログに詳しく書いていますので(英語)](https://blog.bullettrain.co/teams-should-be-an-mvp-feature/)興味ある人はそちらを参照してください。
ザッと説明すると、複数のチームに属することができて、そのチームのメンバーになっていることを表すのが「Membership」モデルであって「User」モデルではないです。例えば、あるチームを作ったユーザーはそのチームからメンバーじゃなくなったとしても、他のユーザーがAdminとしてさえ残っていたら、そのチームはなくなりません。ただし、最後のAdminはチームから出ることはできません。

## Super Scaffolding
最後に紹介したい機能はSuper Scaffoldingです。
[実際にSuper Scaffoldingを実行している動画はこちらにあります](https://vimeo.com/244408440)

普通のScaffoldならこう書きますよね:
```shell
$ rails g scaffold Article team:references title:string body:text
```
でも、一つのモデルを他のモデルにネストする時って、やったことがある人は分かると思いますが、上手く動くようにこのコマンド以外に修正が必要なところは他にもあってちょっと面倒いですよね。でもSuper Scaffoldingでは二つのコマンドを打つだけで簡単に新しいモデルをネストすることができます：
```shell
# `scaffold`じゃなくて`model`というところで要注意
$ rails g model Article team:references title:string body:text
$ bin/super-scaffold crud Article Team title:string body:text
```
ここでサイド・バー・メニューにアイコンを入れますかーって聞かれるけど、これは一旦「N」と答えましょう:
```shell
Hey, models that are scoped directly off of a Team (or nothing) are eligible to be added to the sidebar. Do you want to add this resource to the sidebar menu? (y/N)
N
```

データベースのマイグレートをして...
```
$ rails db:migrate
```

これで終了。`bin/dev`でまたサーバーを立ち上げてホーム画面に戻ると新規のArticleを作ることができます:
![Article.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/0480d356-980e-e8b2-a469-a54e003e3f0c.png)

「Add New Article」を押してみると...
![New Article.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/8f71102d-9a12-0fdb-48cb-cdea555080cc.png)

こんな感じです。

文字列以外に、ボタンや他のインプットも対応していますので、ホーム画面からCreative Conceptを作り、作ったCreative Conceptのページで「Add New Tangible Thing」を押すと、他にBullet Trainは何を提供してくれるか確認いただけます：
![Tangible Things.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74313/ed20e47c-47d6-a36c-365c-9b605c2583dd.png)

ここでいうTangible Thingはあくまでどのインプットを設定できるかを見せるためにあり、このモデル自体を隠すには`config/application.yml`に`HIDE_THINGS: true`を書くとなくなります。
英語なのですが、ドキュメントは[こちら](https://bullettrain.co/docs)です。

## Pro版
Stripeによる決済、メール機能やKanbanボードなどもPro版で対応していますので、無料版を使って気に入った人はぜひPro版の詳細も確認してみてください。

## 最近オープンソースになりました！
3月25日をもって元々有料限定だったBullet Trainはオープンソースになったことが[Sin City Rubyで発表された](https://twitter.com/andrewculver/status/1507445981834461188)ので、コントリビュートしたい人はぜひ[GitHubのレポジトリー](https://github.com/bullet-train-co/bullet_train)にプルリクを送ってください。

最後まで読んでいただき、ありがとうございます。