『Rails速習実践ガイド』から学んだこと

学んだこと

この本は結構中身が濃かったので、
ほんのチャプター順に学んだことを振り返りたいと思います
タスク管理アプリを実際に手を動かして作って様々なことを学びました

Rubyの基礎をおさらいした

チャプター1と2を通して、Rubyの基礎をおさらいして、
環境構築をしました。
ここは特に新しいことはなく、
Railsの操作に不自由しないレベルのRubyができればいいとわかりました

Gemfileとbundlerについて

Gemfileに必要なGemを記述して、bundlerを実行すると
必要なファイルと、更に依存するファイルを自動で取ってきてくれます
インストールした後Gemfile.lockにリストアップされます
bundler installとした場合はGemfileに載らない

RailsではDBはpostgresqlを使う

デフォルトでも、sqliteがついていますが、
基本的にプロジェクトを立ち上げるときにpostgresを指定します

実際に手を動かしてCRUDを実装できた

新規投稿、閲覧、更新、削除をCURDと呼びます
WEBアプリの基礎になっていて、これを一通り実装できるようになりました

マイグレーションファイルの作成や追記

Railsでは、直接DBにたいしてSQLを書かず、
アクティブレコードというORMを通して操作します
マイグレーションファイルに、nullを許容しないなどの追記を行えるようになりました

バリデーション

空欄や長すぎる、フォーマットがあってない入力などを弾けるようになりました
エラーメッセージを日本語化して、適切な場所で表示させます

パスワードの扱い方

パスワードは、入力欄を2つ用意し、同一れあればハッシュ化してから保存する
という仕組みを最初から用意されているので、
それを使えば安全にパスワードを取り扱えます

ユーザー登録、ログイン、ログアウトとセッション

セッションを使って、ユーザーのログイン状態を作ります
とりあえず、登録、ログイン、ログアウトを実装しましたが
本格的に使う場合はGemを使うみたいです
パスワードのリセットなどが艦隊にできるようになります

RSpecで自動テストを書く

自動テストの良いところは1度コードとして書いたら
ずっと使いまわしができることです
アプリを更新した後、前に書いた自動テストでチェックできます

セキュリティ

ぼんやりしていたCSRFXSS、インジェクションに対する理解が深まりました

ルーティング

ルーティングは、管理人用と一般ユーザー用に分けて書けば
別々にすることができます

日本語化とタイムゾーン

アプリのデフォルト言語を日本にして
タイムゾーンをAsia/Tokyoにしました

アセットパイプライン

Railsはscssに対応しています
バラバラのscssとjsのファイルをひとまとめにして出力します

プロダクション環境

本番環境では、環境変数やDBの扱いが、開発環境と違うので注意が必要です
マスターキーやクレデンシャルについて学びました
デプロイするプラットフォームによっても、扱いが変わると思います

確認画面をつける

ここから、追加機能です
RESTの7つ以外のルーティングを追加して、
コントローラにも機能を追記して、確認画面を作りました
問題は、確認画面をつけると他の機能とコンフリクトすること

検索やソート

Gemを使って検索やソートをつけました
このあたりは、実際に開発しているのに近いと感じました

メール送信機能

mailcatcherを使うように書いてありますが
サーバーが立ち上がらないのでmaihogを使ったらうまくできました

画像ファイルをアップロードして表示させる

画像が表示されると結構雰囲気が出ます
アクティブストレージをインストールして、マイグレーションしたら
スムーズに実装できました

CSVのエクスポートとインポート

コードの書き方が難しかったです。
無事実装できたけど、重複するものを弾くにはまだ一工夫が必要

ページネーション

kaminariを使ってページネーションを実装しました
configファイルを生成したら、出力するCSSを変えれるので
見た目をカスタマイズできます
また、日本語訳を当てると日本語にできます

Jobスケジューリング

必要性を感じなかったのでスルーしました

Javascript関係

情報が古いので読み流しました

github

rebaseとmergeの違いなどがわかりやすかったです
プルリクする前に、リモートのmainが先に進んでいる場合は
mainを1回ローカルに取ってきて、マージした後
ローカルのmainを開発中のブランチにマージしてから、
プルリクすればいいとわかりました
-f pushは危険だと思います

継続的な改善やリファクタリング

まだ実際に書いているコードが少ないので
まだしっくり来てません
経験積んだら読み直したいと思います

難しかったこと

難しかったことって言われたら、全部難しい
特に苦労したことは、本のバージョンが5.2だけど、自分は7で動かしていたので
自力で解消しないといけない差異がいくつもあって、理解するのに苦労した

良かったこと

網羅的に色々書いてあるので、Railsの全体像を掴むことができた
Todoアプリを通して、実際に手を動かして、エラーを解消して、理解を深めることができた
とりあえずRailsに関するインプットはもう十分と感じれるボリュームでした

Rails7に対する補完

Rails5.2と7では、主にjs周りに変化があって、それについて補完したい

ujsとturbo

5.2ではujsで、getとpost以外のリクエストを送ったり
「本当に削除しますか?」のポップアップを操作していましたが
7ではhotwireのturboという機能を使うので、操作の仕方が違います

 td = link_to '削除', task, data: { turbo_method: :delete, turbo_confirm: '本当に削除しますか?' }, class: 'btn btn-danger'

これはslimですが、link_to引数でdata: { turbo_method: :delete, turbo_confirm: '本当に削除しますか?' }のように渡すことで、
HTTPメソッドと、ポップアップを操作します

ajax通信せずにページ遷移する

= form_with model: @task, local: true, url: confirm_new_task_path,  data: { turbo: false } do |form|

data: {tarbo: false}を引数として渡すと ajax通信せずにページ遷移します

まとめ

とにかくRailsについて、たくさん学べました。
インプットはもう十分だと感じるので、アウトプットを通して、定着させたいと思います。