【増補改訂版】パーフェクト Ruby on Rails を読む - その1
【増補改訂版】パーフェクト Ruby on Rails を読んだので、頭が整理できた部分をなるべく自分の言葉でまとめていきます。
1 章 Ruby on Rails の概要
Rails の思想
Rails は4つの基本思想からなる。
1. CoC (Convention over Configuration)
直訳は「設定より規約」
Rails の規約を守ると 手動の設定が減り、共有ルールにより会話が円滑 になる。
それによって サービスのコアバリューの実現に集中できる というメリットが有る。
[規約]
- DB のテーブル名はモデル名の複数形にする( Employee モデルの時 employees )
- /employees という URL は社員の一覧を表す
- /employees/1 は 社員 ID が1の社員情報を表す
2. DRY (Don't Repeat Yourself)
直訳は「同じことを繰り返さない」。
同じ処理やコードは1箇所にまとめることで、メンテナンス性が向上する。
Rails 起動時にモデルに対応するテーブルのカラム名一覧を取得することで、employee.name
のようなメソッドなどを利用できるようにしている。
3. REST (Representational State Transfer)
これは Web アプリケーションの設計概念の1つ。 その概念のうち、以下の考えを取り入れている。
- すべてのリソースに一意となる識別子がある(例:/employees/1 など)
- URI を通してリソースを操作する手段を提供
これにより、簡潔で拡張しやすいコード になる。
4. 自動テスト
設定しなくてもテストのテンプレートが作成され、テストを実行する環境が揃っている。
2 章 Ruby on Rails と MVC
MVC アーキテクチャ
改めて M, V, C の説明。
- M = Model:DB との接続と、データの操作およびビジネスロジック。
- V = View:Model の内容を参照し 表現する。
- C = Controller:Model ロジックを呼出し View の選択をする、など M と V をつなぐ。
「システムを作る」ということは「解決したい問題に関する概念をデータ化して名前や関連を定義する」こと。 この行為をモデリングともいう。
そして、Rails では Active Record によってモデルを定義し、以下の役割を持つ。
1. DB と接続して、DB のレコードと Active Record オブジェクトを結びつける。
[主な機能の例]
2. ビジネスロジックの振る舞いを実行する。
バリデーションやレコード保存や削除等の際に実行されるコールバックを実行する ※ 詳細は 12 章
モデルを扱う
ActiveRecord::Relation クラス
DB のレコードを取扱う際に、ActiveRecord::Relation というクラスを使う。
具体的には、ActiveRecord の Query Interface によって操作した結果を ActiveRecord オブジェクトとして表現する。
例えば Book モデルが存在している場合に、Book.where('pages > ?', 300)
のように where メソッドを呼び出すと「 where メソッドに対応する SQL を発行する」という情報を持つ。
このとき 実行結果が必要となるタイミングで DB にアクセスする
そして実際に発行されるまでは、繰返しメソッドが呼び出されれば SQL が更新(追加)されていく。
取得された結果は ActiveRecord オブジェクトの配列のような形で使える。
Scope
繰り返し利用するクエリは app/models/ にあるモデルのファイルで scope として定義すると簡単に利用できる。(引数も渡せる)
コントローラーの役割
ブラウザからリクエストがあったときに、ルーティングに登録されたコントローラのアクションが、データの取得・加工、返却(ビューに描画指示)を行う。
フック
アクションに対して処理を設定するフックは以下の3つが存在する。
- before_action: アクション実行前
- after_action: アクション実行後
- around_action: アクション実行前後
around_action は以下のように yield
でアクションを実行する部分を指定する。
class HogeController < ApplicationController around_action :logger_around_action, only: [:destroy] # 略 private # 略 def logger_around_action logger.info("before action") yield logger.info("after action") end end
CSRF 対策
CSRF とは悪い人が用意したリンクをクリックすると、勝手にデータ操作されてしまうという攻撃のこと。 Rails ではセキュリティートークンを用意して、GET リクエスト以外はトークンを検証して、正しいアクセスかを確かめている。 protect_from_forgery というクラスメソッドを使うと、トークンによる検証をスキップできる。