パRailsの第2章のメモ

October 22, 2020

  • Model
    • データベースとの接続とデータに対する操作、ビジネスロックを担当する
  • View
    • Model の内包を参照して、視覚表現を行う部分
  • Controller
    • Model のロジックを呼び出し、必要な View の選択したり、Model と View をつなぐ部分

モデル

  • ActiveRecord によるモデルには大きく 2 つ役割がある

    • データベースと接続してデータベースのレコードと ActiveRecord オブジェクトを結びつける
    • よりビジネスロジックの実装的なふるまいをすること。バリデーションやレコード保存時などに実行するさまざまなコールバックなどを実行する
  • CRUD とはデータベースのレコードに対する基本的な操作のことを言う。Create、Read、Update、Delete。作る、参照する、更新する、削除する。

  • ActiveRecord クラスがバリデーションに失敗すると、どのフィールドでどのようのなエラーが発生したかをインスタンス変数に記録する

  • 保存操作を行う create や update のメソッドには、create!、update!などの!を伴うメソッドがある。

    • ! をつけるとバリデーション失敗時に例外「ActiveRecord::RecordInvalid」が起きる
    • つけないと例外は起きない。true/false で分岐処理するときなんかはこちらを使用する
  • レコードを作成して保存する一連の流れの間のさまざまな箇所で任意の処理を呼べる。特定の処理に引っ掛けて別の処理を呼ぶことをコールバックという

  • ActiveRecord が提供する enum 型は数値のカラムに対してプログラム上で扱える別名を与えることができる

コントローラー

  • アクションの前後に処理を差し込むコールバック処理のようなものをフックと呼ぶ。

    before_action :set_book, only: [:show, :destroy]
    
    def set_book
      @book = Book.find(params[:id])
    end
    

    みたいなやつ。only や except オプションでアクションを制限することができる。

  • Rails における CSRF(cross-site request forgeries クロスサイトリクエストフォジェリー)とは

    • 悪意ある第三者が用意したリンクなどをサービス利用者が踏んだときに、ユーザーの意図に反してデータの削除などが行われてしまう問題
    • 対策として Rails はデータの削除などを利用する場合、リクエストに対してあらかじめセキュリティトークンを発行している。リクエスト時に発信されたトークンを検証することで第三者ではなくユーザーのリクエストであることを判定している。
    • トークンで正しいリクエストかどうかを判断しているということらしい
  • resources のブロック内に member を利用すると「/publishers/:id/detail」のように個別のリソースに対してアクションを設定する。collection を利用すると「/publishers/search」のように、全体のリソースに対してアクションを設定できる。

    • リソースに対してアクションを設定するという言葉遣いをするみたい。なるほど。
  • 例外処理

  • ユーザーに通知すべき例外処理などは基本的にコントローラが担当する。いくつかの特定クラスに対応するステータスコードを Rails は用意している。特定の例外に特定のレスポンスを返したい場合は、rescure_from を使う。例外クラスを指定し、with オプションで例外発生時に呼ばれるアクションを指定する

  • StrongParameters は MassAssignment 機能を利用する際の脆弱性に対抗するためのもの。MassAssignment とは、Ruby のハッシュを使って、モデルの属性の生成・更新を一括で設定する機能のこと。

    • 危険性とは、意図しない属性の変更を一般ユーザーに許してしまうことを指す。リクエストにキーを指定し、そのなかの特定のキーのみ受け付ける、という制限をかけることができる。

ビュー

  • ビューはコントローラーで取得したデータをユーザーが認識可能な形式にレンダリングするところ。HTML での表示や API での返り値だったりする。
  • respond_to ブロックを使うと、html や json フォーマットを出し分けることができる
  • variants を使用すると条件によってテンプレートを切り替えることができる
  • Rails では、開発の手助けとなるビューヘルパーを用意してくれている。例えば form_with。
  • Prifix の値+ _path を付けるとドメインやポート番号を除いた/から始まるパスの部分を返し、+ _url だとドメインなどを含めた完全なパスを返す
  • HTML のビューを動的に生成する場合、セキュリティからの観点で気をつけるべきは、クロスサイトスクリプティング。プログラムが意図しない文字列を渡すことで、あるページに対して自由に Javascript を埋め込んで、実行させてしまう攻撃方法のこと。
  • String のオブジェクトをテンプレートエンジン内で描画しようとすると、自的動に HTML タグに対してエスケープ処理を施すことでクロスサイトスクリプティングに対策している。
  • API サーバーにとってのビューの役割は Json を生成すること。Rails では組み込みで jbuilder という gem パッケージを利用していて、jbuilder を使うことで宣言的に JSON データを整形できる。

まとめ

  • アプリケーションの主要なロジックはなるべくモデルに書くこと