tawara's blog

雑記。個人の見解です。

パRailsの第2章のメモ

  • 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型は数値のカラムに対してプログラム上で扱える別名を与えることができる

コントローラー

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

    ```s before_action :set_book, only: [:show, :destroy]

    def set_book @book = Book.find(params[:id]) end ```

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

  • RailsにおけるCSRFcross-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データを整形できる。

まとめ

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