Rails4 の Strong Parameters でリクエストパラメータを検証する


こんにちは、鈴木です。

 

Rails4 の新機能である Strong Parameters を試してみました。

 

※2013/10/03 TECHSCORE 本体の記事になりました!「StrongParameters | TECHSCORE(テックスコア)

 

Strong Parameters は個別の Gem ライブラリでしたが、Rails4 のコア機能として取り込まれました。

Strong Parameters を使用すると、ホワイトリスト形式でリクエストパラメータを検証することができます。

 

Rails3 では Mass-assignment (モデルの複数属性への一括代入)を防ぐために attr_accessible を使用していましたが、Rails4 からは Strong Parameters を用いて Mass-assignment に対応することができます。

 

Strong Parameters を試す

Rails4 beta のプロジェクトを作成する方法は「Hello Rails4 beta」をご参照ください。

ここではプロジェクトは作成済みとして話を進めます。

scaffold でコード生成

まずは scaffold で User モデルと関連ファイル一式を作成します。

実は scaffold を使用すると、Strong Parameters の機能を使用したコードが生成されます。

コントローラ (app/controllers/users_controller.rb) を開くと、以下のようになっています(Strong Parameters に関係する部分以外は省略しています)。

user_params という private メソッドの中に注目してください。

「params.require(:user).permit(:name, :email)」となっています。

このコードは「params が :user というキーを持ち、params[:user] は :name 及び :email というキーを持つハッシュであること」を検証します。

例えば、params[:user] が {:name => 'taro', :email => 'taro@example.com'} のようなハッシュである場合に検証 OK となります。

 マイグレーション及びサーバ起動

次にマイグレーションを実行します。

あとでブラウザからアクセスして動作確認するので、サーバを起動しておきます。

 ブラウザで動作確認

それでは「http://localhost:3000/users」にアクセスしましょう。

ユーザ一覧画面ですが、まだデータが登録されていないので一覧には何も表示されません。

rails-strong-parameters-01

ユーザ登録画面に移動し、適当な値を入力して、登録してみましょう。

rails-strong-parameters-02

処理に成功しました。

rails-strong-parameters-03

 

それでは、コントローラのコードを修正し、今までのように(Rails3 時代のように)params[:user] をそのまま返すように修正してみます。

もう一度、ユーザ登録してみましょう。

rails-strong-parameters-04

今度はエラーとなりました。Rails3 の頃と比較してエラー画面が綺麗になりましたね。

rails-strong-parameters-05

これが Strong Parameters の動作です。

許可するパラメータをホワイトリスト形式で準備しておき、それを基に検証を行います。

検証エラーの場合は例外 ActiveModel::ForbiddenAttributesError が raise されます。

 

許可していないパラメータの扱い

許可していないパラメータが渡された場合はどうなるのでしょうか。

デフォルトでは無視される

試に user_params の内容を以下のように修正してみます。

この状態で再度ユーザ登録を行うと、リクエストパラメータとして名前(name)とメールアドレス(email)が渡されますが、メールアドレス(email)は無視されます。

ログを確認すると以下のようなメッセージが出力されていました。

 許可しないパラメータが渡された場合に例外を発生させる

許可しないパラメータが渡された場合の動作は config/application.rb で変更することができます。

試に例外を発生させるように変更してみます。

この状態で再びユーザ登録を行うと(リクエストパラメータに name と email が渡されると)、ActionController::UnpermittedParameters という例外が raise されました。

 

ネストしたパラメータ

Strong Parameters のドキュメントを読むと、permit メソッドの引数を以下のように指定することで、ネストしたパラメータに対応することができるようです。

 

まとめ

Rails3 の attr_accessible は、画面ごとに受け付けるパラメータが異なる場合にモデルのコードが膨れ上がってしまうという問題がありました。

Rails4 でコア機能として取り込まれた Strong Parameters を用いると、そのあたりのコードがスッキリすることが分かりました。

 


Trackbacks

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です