Opsの私が Ruby on Rails チュートリアルをやってみた感想

記事タイトルとURLをコピーする

こんにちはマネージドサービス部 大城です。

飛行機で時間があったので、最近勉強したRuby on Rails チュートリアルの感想を書きます。

私はOpsの仕事をしていて、AWS環境でインフラ屋さんをしながらNew Relic、Datadog、Zabbixとたわむれています。

普段コードを書くことはあまりないのですがRuby on Rails(以下Rails)チュートリアルをやってみました。

Railsとは

Rubyのgemsの一つで有名なweb Frameworkです。利用している有名なサービスはGitHub、Shopify、Timee、freee などです。サーバーワークスでも Cloud Automator で Rails を使っています。

cloudautomator.com

github.com

Railsチュートリアルとは

Railsを使ってプロダクト開発をゼロから学べる学習コンテンツです。Webテキスト版だと約1000円で購入でき、動画コンテンツは約3万円で購入できるようです。私はWebテキスト版を購入しました。

チュートリアルという名の通りテキストにかかれている内容を実装していけば実際に動くWebアプリケーションが作成できます。私が購入したv7.0では X(旧Twitter)のようなWebアプリケーションを作成していく内容でした。

railstutorial.jp

きっかけ

冒頭でも書きましたが私はOpsの経験が長く普段はコードを書くことがあまりありません。

今後もロールを変える予定はないのですが、最近New RelicでAPM周りを触ることもあってインフラレイヤーだけじゃなくアプリも勉強したいと思っていました。

ちょうど2024年5月に沖縄で開催された RubyKaigi 2024 に参加してRubyを触ってみたくなりテキストを購入しました。

rubykaigi.org

私のRuby歴

数年前にRubyのChefでOS以上のプロビジョニングのコードを書いたことがあります。コーディング経験少ない私でも書きやすい言語の印象をもっています。

当時はAnsible派とChef派で分かれていましたが私はChef派でした。最近はOS以上のプロビジョニングだとAnsibleが強いですね。

学習環境

テキストには GitHub Codespaces で進める方法が記載されていますが、インストールから学びたかったので私はMacローカルにRubyをインストールして学習を進めました。

参考になったリンク

【Mac】rbenv を導入して Ruby のインストールとバージョン管理を簡単にする #Ruby - Qiita

Bundlerの使い方 #Ruby - Qiita

第1章 から 第3章 まで

テキストを購入しなくても参照できます。

ざっくりとした内容

Model-View-Controller(MVC)の説明やHello world 的な内容です。Railsチュートリアル用のテンプレートページから自身の GitHub にリポジトリを作成して、ブラウザでアクセスできるところまで手を動かします。後半にGitの使い方や render へのデプロイ方法が書かれています。

Cloud Application Hosting for Developers | Render

感想

Model-View-Controller(MVC)

Model-View-Controller(MVC)は知らなかったので勉強になりました。Qiitaの記事も参考に読みました。役割を決めて実装することで、考えることが減り、開発メンバーの入れ替えの影響も抑えることが出来ます。

参考になったリンク

超初心者講座~MVCモデルについて~ #Webアプリケーション - Qiita

テスト駆動開発(TDD)

「3.3.1最初のテスト」にてテスト駆動開発(TDD)の流れを体験できます。

  • テストを書く。まずは実行して RED を確認する
  • テストが GREEN になるようコーディングを進める

昔Chefを書いていたときにChef InSpec(昔はServerspecと呼ばれていた)でインフラのテストコードを書いていたので違和感なく進めることができました。

インフラのテストコードは実行に時間がかかってしまうので億劫だった記憶がありますが、アプリだとテストのフィードバックが早いのでやっていて楽しいです。

第4章 以降

テキストを購入すると参照できるようになります。

ざっくりとした内容

X(旧Twitter)のようなWebアプリケーションを作成していく内容です。最初はユーザーを保存するテーブルを作るところから始まり、ポスト、フォロー/フォロワー、フィードの実装までチュートリアルが書かれています。

感想

ログインの仕組み

DBにユーザー、パスワード情報がどのように格納されるか、Cookieがどのように発行され管理されているか、ブラウザ側の挙動なども学べます。

最近だとIdPのSaaSが充実しており、一から学ぼうという気が起きないのですが、実際に手を動かして作ってみると、仕組みが把握できて勉強になります。

一般的なアプリケーションでよく見る下のような実装も体験できるので良きでした。

  • ユーザーのログイン状態をブラウザを閉じた後でも有効にする[Remember me]機能
  • パスワードの再設定
  • 「forgot password」リンクを追加
  • パスワード再設定用のトークンとダイジェスト
三項演算子が便利だけど難しい

このコード、意味分からなくないですか?私は最初見たときまったく理解出来ませんでした。

user && user == current_user

「渡されたユーザーがカレントユーザーであればtrueを返す」という処理になります。これが1行で書けるのは、なんというか意味不明でした。理解できなかったので、下のように分解して理解しました。

なるほどよく出来ているなぁと感じます。

# ruby は何か値が入っていたら true になる
if user.nil?
  # 値が入っていなかったら false
  return false
else
  # 値が入っている場合、カレントユーザーであるかチェック
  if user == current_user
    # カレントユーザーだったら ture
    return true
  else
    # カレントユーザーじゃなかったら false
    return false
  end
end

参考になったリンク

&& || & |の使い方 #Ruby - Qiita

Ruby true false 判定をする方法 #Ruby - Qiita

メタプログラミング

メタプログラミングとは「プログラムでプログラムを作成する」ことです。と書かれています。最初は理解出来ませんでした。

チュートリアルを進めていくと、メソッド部分を変数として指定することで、同じコードで処理内容を変えるような実装が出てきます。便利だけど、ちょっと難しい

参考になったリンク

【初心者にも分かりやすく】メタプログラミングって何? #Ruby - Qiita

フォロー、フォロワーのテーブル設計

1人のユーザーには「フォローする」「フォローされる」といった関係性がある。テーブルとしてどのように実装するのか書かれています。

チュートリアルでは中間テーブルみたいなのを作って実装していきます。よく考えられているなぁ、と感じます。

Hotwire

ページ全体を再読み込みするのではなく、変更された部分だけを置き換える方法。railsの場合Turbo使って実装していきます。

ブラウザの開発ツールで見ると、Turboで実装するとリクエスト量が明らかに減っていることがわかりました。

N+1クエリ問題

フィードの実装で出てきます。フォローしているユーザーのポストをフィードに表示する実装をする際、普通に考えると下のような実装が思いつきます。

  • 1.フォローしているユーザーをDBから取得
  • 2.取得したユーザーのポストをDBから取得

ただし、これをしてしまうとN+1問題になってします。フォローしているユーザーが5000人いる場合、SQLの実行回数が 5001 回になってしまいます。

解決するために、チュートリアルでは eager loading を利用します。少しだけSQLも出てくるので勉強になります。

「設計より規約」のアプローチ

昔やっていた Chef でもこの考え方だったので違和感なく進めることができました。規約が決まっていて、規約通りにコーディングしないと上手く動いてくれません。

最初はとっつきにくいですが、なれるとコーディングが早くなります。

最後に

ここまで読んでいただき、ありがとうございます。チュートリアルを完走するまで、3ヶ月かかりました。難しかったですがやってよかったです。

合間に出てくる演習は自力で出来ないものもあったのでググって進めたのもありました。とりあえず1周しましたが実際に開発するためには2、3周したほうが良いと思いました。

大城 慶明 (記事一覧)

マネージドサービス部

2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS13冠。NRUG沖縄支部運営。X @yo_ohshiro