Ruby on Rails5速習実践ガイドを一通り読むことができましたため、読んでみて、良かったところや学んだこと、難しかったことを記載します!
良かったところ
設計についても触れられていたこと
Railsの文法の話だけでなく、コードの可読性を高めるためにMVCモデルの中のどこにコードを書いた方が良いのか、または新しいクラスを作成して、そこにコードを書いた方が良いのかが書かれていのはとても勉強になりました。
モデルに書くべきなのか?それともコントローラーに書くべきなのか?の判断基準が不明確でしたが、書籍を読んだことにより、少しずつ明確になってきました!
印象的に残った箇所は、モデルに書くのは、モデルオブジェクトのデータを加工したりする場合は、モデルに書いた方が良いです。
例えば、テーブルに郵便番号(123-4567)が保存されており、ビュー側は123と4567で別のインプットボックスとなっております。ビューでユーザから入力された郵便番号が123と4567で別々に入ってくるため、テーブルに保存する際には郵便番号を保存する際には結合して、格納する必要があるため、結合処理をコントローラーではなく、モデル側で行います。
編集画面でテーブルから郵便番号をビュー側に表示する際にも郵便番号を123-4567を123と4567で分割する必要があるため、その際にもモデル側で分割処理を記述する必要があります。
また、モデルオブジェクトのインスタンス変数を呼び出して、データを変更している処理もモデルに記述します。
例えば、ブログに関するプログラムにおいて、記事の公開状態や公開日時を変更する処理はコントローラーではなく、モデル側に書きます。@article.status = 'published'
や@article.published_at = Time.current
のようなコードのことです。このようなコードが連続している場合は、モデルに寄せます。
最後に、ビュー側にビジネスロジックを書かず、モデル側に書くことです。
ビュー側に計算処理や比較演算子を用いた判定処理は書かないで、モデル側に書くことです。また、モデルに書くのか、ビューに書くのかの判断が難しい場合は、Decoratorも検討します。
例えば、日付の表示形式がテーブルで保存されているデータとビューで表示したい場合で異なる場合です。
学んだこと
マイグレーションファイルはロールバックできることも確認する
マイグレーションファイルはrails db:migrate
してテーブルが作成できることだけなく、rails db:migrate:redo
をすることによって、ロールバックできることも確認する必要があることです。
ロールバックすることになった場合にロールバックが失敗してしまう可能性もあるため、マイグレーションファイルを作成した際にはロールバックできることも確認が必要であることです。
今まではマイグレーションファイルを作成して、テーブルが作成できればオッケーと思っていましたが、最悪の事態も想定して、ロールバックができることも確認する必要があることを学びました。
タイムゾーンの設定に関する仕組みについて
タイムゾーンはデータベースからデータを取得・更新する際だけでなく、Railsでモデルからデータベースのデータを取得したcreated_atはTimeWithZoneオブジェクトのため、そのオブジェクトにもタイムゾーンが設定されております。
データベースおよびTimeWithZoneオブジェクトのタイムゾーンの設定ファイルがそれぞれあることを知りました。
アセットパイプラインの仕組みについて
JavascriptやCSSなどのフロント側のプログラムをどのようにして、ブラウザで参照することができるようになるのかの仕組みを知ることができました。アセットパイプラインによって、ブラウザが高速にフロントエンドのプログラムを参照することができるようになっていることを知りました。
アセットパイプラインでは以下のことを行なっております。
- SCSSやcoffeeスクリプトなどのプログラムをCSSやJSにコンパイル
- コンパル後にCSSやJSをapplication.jsやapplication.cssなどにまとめられます。
- まとめられた後に、改行やスペース、コメントなどが削除される。
- コードからハッシュ値を生成して、それをファイル名に付与します。ハッシュ値を付与することで、ブラウザがキャッシュしていたファイル名と異なるようにすることで、新しいファイルが正常に読み込まれるようになります。
開発環境と本番環境でアセットパイプラインが行なっている内容も異なります。
本番だと上記に記載したコンパイルからダイジェストの付与まで全て行います。一方、開発環境では、デバッグのしやすさを考慮して、アセットの連結や圧縮は行いません。
開発者ツールでJSをデバッグする際に開発環境だとプログラムで書いた内容をそのまま見れますが、本番環境だとプログラムの内容と異なって表示されており、疑問に思ってました。アセットパイプラインが環境ごとに行う内容が異なっていたからだと学びました!
難しかったところ
chapter10-12-4 外部サービスのロジックを閉じ込めるという箇所が読んでも頭に入らなかったため、時間をおいてもう一度読み返してみようと思います!