fugafuga.write

日々のログ

パーフェクト Ruby on Rails 2章 まとめ Model, Controller編

読んだので反復

MVC アーキテクチャ

Model

データに対する操作、ビジネスロジック

View

Modelの内容を参照し、視覚表現を行う

Controller

Model のロジック呼び出し、View の選択

モデル

あるシステムに必要な概念を探して、それに対して名前を付けたり、相互の関係性を整理したりすることをモデリングという。

ActiveRecord によるモデル

データベースに接続し、エンティティとDBのレコードを結びつける。
SQLや接続処理を抽象化する。
ビジネスロジック、バリデーション、コールバック処理が実装される。

QueryInterface

SQLのSELECTなどに対応したメソッドがある。

ActiveRecord::Relation

QueryInterface の結果として返されるオブジェクト。
どんなSQLを発行するか、という情報を持っている。

scope

モデルに定義できる。
よく利用する検索結果に名前をつけて、それを利用できる。
デフォルトで特定のScopeが適用された状態にすることも可能。

モデル同士のリレーション

一対一 -> has_one
一対多 -> has_many
多対一 -> belongs_to

多対多については、中間モデルを作って関係を表現する。

バリデーション

ActiveRecord、ActiveModel に機能として組み込まれている。
独自のバリデーションはブロックを使って書ける。

コールバック

レコードを作成して保存する一連の流れの様々な箇所で任意の処理を挟むことができる。
コールバックポイントが用意されており、バリデーションの前後、初期化後などが指定できる。
コールバック起動に条件を指定することができる。

ActiveRecord enums

Rails4.1 で追加された。
モデルのステータスを数値で保持でき、プログラム上では文字として読める。

コントローラ

config/routes.rb にルーティングの設定が記載されている。
この中に定義されたルーティングのパターンからマッチするものを探して、アクションを決定する。
表示するビューを決定する。
ビューのフォーマットを指定することができる。(html, csv, jsonなど)

アクションコールバック

コントローラのアクションにはコールバックを定義できる。
複数のアクションで行う処理を共通処理として切り出すことができる。
コールバックポイントが用意されており、アクション前、後、前後が指定できる。
コールバックをスキップすることもできる。

ルーティングとリソース

コントローラに resources :hogehoge を書くと複数のルーティングが定義される。
resources はブロック中に設定を追加することで拡張できる。
親子関係にあるリソースをルーティングで表現することができる。
member ブロックは、個別のリソースに対してアクションを設定できる。
collection ブロックは、全体のリソースに対してアクションを設定できる。

resources 以外のルーティングパターン

アプリケーション上、1つしか存在しないようなリソースをルーティングで定義する時には、resouce :hogehoge と書く。 一覧表示や、IDによる絞り込みのアクションが定義されない。
特定のアクションのみを利用するようなルールの設定もできる。

例外処理

Railsアプリケーションでは基本的にコントローラが例外処理を行う。
特定の例外を投げると、それに対応するHTTPのステータスコードを返す仕組みがある。
rescue_from というクラスメソッドを使い、特定の例外と例外時の処理を結びつける。

StrongParameters

Rails4 からモデル生成、更新時にHashクラスを使って一括で属性を設定できる機能がある。
これを Mass Assignment 機能という。

この機能を使用すると、ユーザーからのリクエストパラメータを全て一括でモデルに設定することができる。
その際、意図しない属性も書き換えられてしまうという脆弱性がある。

その脆弱性を防ぐための機能が StrongParameters である。

仕組みとしては、Mass Assignment 機能で設定できる属性を指定し、設定されたHashのkeyを事前に検査するというもの。
params.require(:user).permit(:name, :email) のように指定する。

リクエストパラメータに:userというkeyが必要で、かつ、user の中で受け付けて良い属性は、:name:email のみという意味。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

パーフェクトRuby on Rails

パーフェクトRuby on Rails