コントローラーとは
コントローラーは、モデルやビューを制御するためのオブジェクトである。
リクエストに応じてルーターから呼び出されれ、リクエストの内容をもとに、決められたアクション内の処理を実行する。
モデルからデータを取得し、ビューで描画するためのデータを準備するなど、アプリケーションの機能を実装し、クライアントへ結果をレスポンスとして返信する。
コントローラーとREST
REST(Representional State Transfer)とは、Webアプリケーションのアーキテクチャスタイルの1つで、Web上での情報交換をするための仕組みである。
RESTは、HTTPプロトコルに基づいて、Webリソースを操作するための一般的なルールを定めており、URI、HTTPインタフェース(GET、POST、PUT、PATCH、DELETEなど)を使用してリソースを表現する。
ルーターという窓口を通して要求内容を受け取り、呼び出されたアクションを実行するのがコントローラーの役割である。コントローラーは、HTTPリクエストやHTTPレスポンスの情報を制御するとともに、Railsにおける、モデルを中心としたリソースのやりとりを制御している。
コントローラーの仕組み
コントローラークラスは基本的に次のような構成で生成される、
class コントローラー名 < ApplicationContoroller
def アクション名
処理内容
end
end
コントローラー名は基本的に複数形にする。ルーティングでコントローラーの任意のアクションが指定された時実行する処理をアクション内に記述する。
パラメーター
パラメーターの値を参照するにはparamsインスタンスを使用する。アクションが実行されたタイミングでparamsインスタンスを利用することで、取得した各パラメーターの値をハッシュ値として取り出すことができる。
paramsの要素の取得はparams[:user]
、またはparams["user"]
のように記述する。また、ルートで設定されるidなどのルートパラメーターは、params[:id]
のように参照・取得できる。
ストロングパラメーター
ストロングパラメーターは、セキュリティの脆弱性を回避するための仕組みである。
具体的には、通常のパラメーターとは異なり、特定のパラメーターのみを許可し、その他のパラメーターを無視するように設定できる。
例として、ユーザー情報の新規登録について考える。
受信した新規ユーザーのデータは、params[:user]
で取得することができる。この情報をもとに、次のように新規ユーザーをインスタンス化する。
User.new(params[:user])
パラメーターの許可処理を行っていないため、例外エラーが発生してしまう。
Railsでは、データの保存処理を行うために、保存対象となる属性値を含むパラメーターに対して許可処理を行う必要がある。
requireメソッドは指定されたパラメーターを要求する。
require(指定されたキーのパラメーター)
permitメソッドは指定されたパラメーターを許可する。
permit(許可パラメーター)
次のようなコードの場合、リクエストパラメーターに:user
が含まれていない場合例外が発生し、:name, :email, :password, :password_confirmation
以外のパラメーターは無視される。
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
セッション情報とクッキーの利用
クライアントとサーバーがやり取りした後、情報を保持しない仕組みをステートレスという。ストートレスなWebアプリケーションは不都合なことが多々あり、例えば、一度ログインしても、その情報が消えて、他のアクションをした時にまたログイン要求をされてしまう。
HTTPは、クライアントとWebサーバーのやりとりを行う際、はじめにブラウザとWebサーバー間で接続関係(HTTPセッション)を確立する。HTTPセッションを利用して、クライアントの状態を維持することができる。
-
セッション情報への値の保存
Railsではセッション情報をsessionパラメーターとしてコントローラーおよびビュー内で使用することができる。session[キー] = 値
のように保存する。 -
セッション情報の読み込み
保存したセッション情報を読み込む場合は、sessionに対してキーを指定する。ユーザー情報の@user
インスタンスにセッション情報を読み込む場合、@user = session[:user]
のように読み込むことができる。
このように、1回のやりとりで消えてしまう情報を、保存・読み込みし、アクション間にわたって最低限必要な情報を連携させることができる。
セッションストア
アクション内で生成したセッション情報は、次のリクエストに連携するために裏でセッションにひも付けて保存し、必要な時ににセッション情報として呼び出せるように管理する必要がある。
セッション情報を保存する場所をセッションストアという。セッション情報は、デフォルトでクッキー(ブラウザに保存される情報)に保持されるため、デフォルトのセッションストアはクッキーストアと呼ばれる。