【増補改訂版】パーフェクト 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 RailsMVC

MVC アーキテクチャ

改めて M, V, C の説明。

  • M = Model:DB との接続と、データの操作およびビジネスロジック
  • V = View:Model の内容を参照し 表現する。
  • C = Controller:Model ロジックを呼出し View の選択をする、など M と V をつなぐ。

「システムを作る」ということは「解決したい問題に関する概念をデータ化して名前や関連を定義する」こと。 この行為をモデリングともいう。

MVC のモデルは、モデリングのモデルとほぼ同義 である。

そして、Rails では Active Record によってモデルを定義し、以下の役割を持つ。

1. DB と接続して、DB のレコードと Active Record オブジェクトを結びつける。

[主な機能の例]

  • DB のカラム情報をインスタンス生成時のフィールド情報に反映する
  • SQL の構築を抽象化する
  • DB のコネクションプールや接続の情報を隠蔽する


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 というクラスメソッドを使うと、トークンによる検証をスキップできる。