参考書を読んだメモ : 独習Ruby on Rails 8章

独習Ruby on Rails

ルーターとコントローラー

  • ルーターの役割はクライアントからの要求をアクションに割り付けること
  • コントローラーは割り付けられた要求の実行を制御する
  • モデルはコントローラーの指示を受けてデータベースとのやり取りを行う

    ルーティング

  • ルーターが行うアクションへの振り分け作業
  • config/routes.rb で行う

HTTPメソッド

  • WEBアプリはURIによって、要求の宛先を指示し、HTTPメソッドによって要求目的を支持する
  • GET
    • 情報をサーバーから取得
  • POST
    • 情報をサーバーに取り込む
  • PUT
    • 情報を置き換える
  • PATCH
    • 情報の一部を置き換える
  • DELETE
    • 情報を削除

ルートの対応関係

GET /users users#index
  • 先頭のGETはHTTPメソッド
  • 次の/usersはURI
  • users#index はUsersControllerのindexアクション

リソースフルルート

  • モデルを介したリソースに対するデータの追加、更新、削除、取得、一覧表示のお決まりの操作をリソースフルルートとしてひとまとめに表現できる
  • new
    • 新規登録
    • 新規画面表示
    • 入力したデータを送信
  • create
    • 新規登録
    • 登録処理
    • 入力されたデータを登録
  • edit
    • 変更登録
    • 編集画面表示
  • update
    • 更新処理
  • show
    • 紹介処理
    • 詳細画面表示
    • 特定のデータを呼び出し表示する
  • 一覧紹介
    • 一覧画面表示
    • 複数のデータを呼び出し、一覧で表示する
  • destroy
    • 削除
    • 削除処理

ルート設定とルーティングヘルパー

実装ルートの確認

アプリケーションルートの設定方法

root to: 'コントローラー名#アクション'
  • リダイレクトで設定もできる
root to: redirect('users/index')
  • アプリケーションルートの表示優先度
    • public/index.html が存在する場合これを表示
    • routes.rb にルートが設定されている場合ルートに従ったページを表示
    • 設定していない場合はRailsデフォルトページ

非リソースフルルートの設定方法

HTTPメソッド `URIパターン`, to:'コントローラー#アクション'

ルーティングヘルパー

  • Railsのルートを設定すると、宛先URLを1語で表現するPathヘルパーが実装される
  • rails routesで表示した時、左に表示されるprefix欄の名前に_pathをつけることでPathヘルパーとして使用できる
  • URLヘルパーは_urlをつける
  • Prefixが表示されていないルートは上位のルートと等しい

リソースフルルートのオプション

  • as
    • Prefixを変更したいときに使用
  • controller
    • 対応するコントローラー名を変更する場合
  • path
    • 標準のURIを変更したい場合
  • path_names
    • デフォルトのnew, editなどの標準パス構成を変更したいときに使う
  • only
    • 7つのアクションルートのうち指定したもののみのルートを生成する
  • except
    • 指定したルートを除外する
  • format
    • true
      • フォーマット指示必須
    • false
      • フォーマット指示無効
    • 指定なし
      • 併用可
    • 指示しない場合htmlとみなされる
  • constraints
    • パラメーターの内容を制限する場合に使用する
    • ex: パラメータのidを1-9に制限する
  resources :users, constraints: {id: /[1-9]/}
  • collection
    • コレクションルート設定に使用
    • id を特定できないリソースを対象としたルート
    • リソースフルルートでは index, new, create が該当
  • member
    • メンバールートの設定に使用
    • idを特定できる単一リソースを対象としたルート
    • edit, update, show, destroy が該当
  • shallow
    • 親子関係を持つ入れ子ルートに対して直接子のidだけでアクセスできるように表現を変更する
    • show, edit, update, destroy に対して
  • shallow_path
    • 指定されたパス名を入れ子の shallowルートのURL前に付加
  • shallow_prefix
    • 指定されたプレフィックス名を入れ子のshallowルーティングヘルパーの接頭辞に付加
    • 1階層化されたshallowルートに会えて接頭辞を挿入できる

リソースフルルートのグループ化

  namespace :admin do
    resources :users
end
  • この場合クラスは本来のUsersControllerではなくAdmin::UsersControllerとなる
  • ファイルの保管場所もapp/controllersではなくapp/controllers/adminに保管される
  • scopeメソッドを使用したグループ化
  scope :admin
    resources :users
  end
  • namespace とは異なり標準のapp/controllerディレクトリ直下のusers_controller.rbを見に行く
  • resources :users, path: '/admin/users'と同様の結果になる
  • moduleオプションを使うと呼び出すコントローラーをnamespace指定の場合と同じディレクトリ構成にできる
  • namespace と一致したルートの指定
  scope :admin, as: :admin, module: :admin do
    resources :users
  end

ルートの共通化

  • 重複するコレクションルートの追加を簡潔にできる
  concern :searchable do
    get 'search', on: :collection
  end

  resources :users, concerns: :searchable
  resources :books, concerns: :searchable

コントローラーの役割

コントローラーとREST

  • HTTPプロトコルを通して同じ宛先URIとパラメーターの組み合わせによってリクエストし、常に同じレスポンス結果が得られることを期待する通信アクセスの仕組み
  • コントローラーはActionController::Base を継承している
  • レンダリングやレイアウト機能、リダイレクト機能を備えている
  • ActionController::Metal は↑を含まないシンプルな制御機能を提供している

コントローラーの仕組み

  • クライアントからのHTTPリクエストに基づいてルーターで処理が振り分けられ、対応するコントローラのアクションが呼び出される
  • これはルーターによって呼び出されたコントローラーがインスタンス化され、インスタンスメソッドが実行されている
  • HTTPリクエストを受けHTTPレスポンスを送信して処理を終了する
  • 最後にはレンダリング処理をして終了する
  • アクションの中で実行した全ての一時的な資源はなくなる
  • 基本的なRailsアプリケーションの流れはHTTPリクエストに対して1つのアクションが実行され、HTTPレスポンスが送信される

HTTPヘッダー情報などの取得方法

  • requestメソッドでリクエストオブジェクトとしてリクエスト情報を取得できる
  • リクエストオブジェクトのheadersメソッドでヘッダーオブジェクトとしてヘッダー情報を取得できる
  • host
    • ホスト名を取得
  • format
    • コンテンツタイプを取得
  • method
    • リクエストメソッドを取得
  • headers
    • ヘッダー情報を取得
  • port
    • ポート番号を取得
  • protocol
  • query_string
    • クエリ文字列を取得(?以降)
  • remote_ip
  • url
    • URLを取得
  • ネットワーク上ではPATCHやDELETEであってもHTTPメソッドのGETやPOSTのみしか使用されていない
    • 他のメソッドは疑似的に受け取っているように見せている
  • responseメソッドでレスポンス情報をレスポンスオブジェクトとして返すことができる
  • body
    • クライアントに送り返されるデータの内容を取得(HTMLの内容など
  • status
  • location
    • リダイレクト時のリダイレクト先URLを取得
  • content_type
    • Content-Type を取得
  • charset
    • 文字セットを取得
  • headers
    • ヘッダーを取得