🚂

Rust on Rails!? Rust 版の Rails と呼ばれる "Loco" を試す!

2024/09/06に公開

Rust 版 Rails "Loco"

LocoRails にインスパイアされた Rust の比較的新しい Web フレームワークです。

2024 年 9 月 1 日時点でバージョン 0.8.0 がリリースされています。

https://loco.rs/

Loco の特徴

タイトルにもある通り、Loco is Rust on Rails. [1] を謳っており、
Ruby on Rails の開発体験の良さを Rust でも再現しようとしています。

また、小さいサービスや個人開発に適したフルスタックフレームワークとして開発されているようです。

内部実装では、コントローラーやルーティングは Axum で実装されていたり、
ActiveRecordSeaORM で実装されていたりするそうです。[2]

Axum や SeaORM については、別の記事で触れているので良ければご覧ください!

Why not Rails?

Rails を使えば良いじゃん! という問いに、
What if Rails was Built on Rust? というブログで次のように答えています。

Ruby に満足しているなら、Rails を使用してください。
でも、Rust が好きなら、Loco を使用してください。

Loco を使用することで Rust が持つ安全性や強力な型システムなどのメリットを享受できます。

クイックスタート

A Quick Tour with Loco に従って、Loco を試してみます!

loco new でプロジェクトを作成する

CLI で操作しながら開発を進めるために、まず loco-cli をインストールします。

また、上述したように SeaORM も使われているので sea-orm-cli もインストールしておきます。

cargo install loco-cli
cargo install sea-orm-cli

以下のコマンドでプロジェクトを作成します!

loco new

対話式になっているので、必要な情報を入力していきます。

今回、アプリケーションのタイプは SaaS app を選択します。

✔ ❯ App name? · loco_app
✔ ❯ What would you like to build? · SaaS app (with DB and user auth)
✔ ❯ Select a DB Provider · Postgres
✔ ❯ Select your background worker type · Async
✔ ❯ Select an asset serving configuration · Clientside

アプリを実行する

POSTGRES_DB の値を loco_app_development に変更して DB 用のコンテナを立ち上げます。

docker run -d -p 5432:5432 \
  -e POSTGRES_USER=loco \
  -e POSTGRES_DB=loco_app_development \
  -e POSTGRES_PASSWORD="loco" \
  postgres:15.3-alpine

以下のコマンドでアプリを実行します。

cargo loco start
トラブルシューティング

最初に cargo loco start を実行すると、以下のエラーが出ました。

Error: Message("one of the static path are not found, Folder `frontend/dist` fallback: `frontend/dist/index.html`")

frontend フォルダを覗くと、確かに dist が存在しません...。

frontend の README には次のように記載があるので、
pnpm build を実行後に cargo loco start を実行すると無事にエラーが解消されました。

(もちろん、pnpm install も忘れずに。)

After the build dist folder is ready to served by loco. run loco cargo loco start and the frontend application will served via Loco

成功すると LOCO が登場します!


                      ▄     ▀                     
                                 ▀  ▄             
                  ▄       ▀     ▄  ▄ ▄▀           
                                    ▄ ▀▄▄         
                        ▄     ▀    ▀  ▀▄▀█▄       
                                          ▀█▄     
▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█    
 ██████  █████   ███ █████   ███ █████   ███ ▀█   
 ██████  █████   ███ █████   ▀▀▀ █████   ███ ▄█▄  
 ██████  █████   ███ █████       █████   ███ ████▄
 ██████  █████   ███ █████   ▄▄▄ █████   ███ █████
 ██████  █████   ███  ████   ███ █████   ███ ████▀
   ▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀ ██▀  
       ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    
                https://loco.rs

environment: development
   database: automigrate
     logger: debug
compilation: debug
      modes: server

listening on localhost:5150

CRUD API を追加する

posts API

ブログ投稿アプリのバックエンドとして post を管理する API を追加します。

scaffold を使って、CRUD API を追加することができます!

cargo loco generate scaffold post title:string content:text

DB を確認すると、posts テーブルが作成されています。

loco cli で追加された API を確認してみます。

cargo loco routes
[GET] /_health
[GET] /_ping
[POST] /api/auth/forgot
[POST] /api/auth/login
[POST] /api/auth/register
[POST] /api/auth/reset
[POST] /api/auth/verify
[GET] /api/notes
[POST] /api/notes
[GET] /api/notes/:id
[DELETE] /api/notes/:id
[POST] /api/notes/:id
[GET] /api/user/current
[GET] /posts
[POST] /posts
[GET] /posts/:id
[DELETE] /posts/:id
[POST] /posts/:id

次に post を作成してみます。

curl -X POST -H "Content-Type: application/json" -d '{
  "title": "I like sushi.",
  "content": "I had sushi for dinner."
}' localhost:5150/posts

作成された post を取得してみます。

curl localhost:5150/posts
[{"created_at":"2024-09-05T14:37:45.252003Z","updated_at":"2024-09-05T14:37:45.252003Z","id":1,"title":"I like sushi.","content":"I had sushi for dinner."}]
curl localhost:5150/posts/1
{"created_at":"2024-09-05T14:37:45.252003Z","updated_at":"2024-09-05T14:37:45.252003Z","id":1,"title":"I like sushi.","content":"I had sushi for dinner."}

scaffold コマンドでバックエンドの API を実装することができました。

とてもスピーディですね...🚂🚂🚂

まとめ

ほとんど Ruby on Rails を触ったことがないので本家と違いが分かりませんが、
CLI で操作しながらサクサクと開発を進めることができてとても新鮮でした🤔✨✨

まだ触りの部分しか試せていないので、もう少し触ってみようと思います。

今後もバージョンアップが進むと思うので、期待が膨らみます!!!!

Rust の Web フレームワーク事情も随時チェックしていかなければ...

参考

脚注
  1. loco-rs/loco: 🚂 🦀 The one-person framework for Rust for side-projects and startups を参照。 ↩︎

  2. What if Rails was Built on Rust? | Loco を参照。 ↩︎

コラボスタイル Developers

Discussion