おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

ginza.rb 第1回を開催して strong_parameters のソースコードを読んだ

7月16日(火)に ginza.rb 第1回を開催しました。

Ginza.rb 第1回 strong parameters - Ginza.rb | Doorkeeper

やったこと

今回からコードリーディング開始です。最初のお題は、Rails 4 から追加された strong_parameters。Rails 4 のコアに組み込まれていますが、Rails 3 系でも gem をインストールすれば使えます。Rails 3 用の方が、コードが gem にまとまっていて読みやすいので、今回はそちらを読むことにしました。

最初に、strong_parameters に詳しくない方向けに、下記エントリを見ながらざっくりと概要を説明しました。

Rails4.0に含まれる strong_parameters について - willnet.in

次に README を眺めて、もう少し詳しく機能を把握。そしてソースコードリーディングに入ります。僕がコードを眺めながら思ったことを話し、突っ込みをもらうスタイルで進めました。終了予定時間を数分過ぎるくらいの時間で、 lib/ 配下と test/ 配下のほぼ全てのコードを読めました。

ざっくりまとめ

読んだ感想を箇条書き。

  • strong_parameters での params(ActionController::Parameters) は、基本的には Hash に permitted フラグ(と各種メソッド)を加えただけのもの
  • permit メソッドは、引数に指定したものでフィルタリングを行い、フィルタを通った全部の要素に対して permitted フラグをオンにして返す
    • フィルタリングする際に、決められたクラスのインスタンスかどうかもチェックする
    • 複雑なパラメータ(ネストしたパラメータ、nested attributes や Date なパラメータ(例: posted_date(1i))) を処理する箇所がややこしい
  • strong_parameters の params で、permitted フラグをオンにしていないやつを使って mass assignment しようとするとエラー(ActiveModel::ForbiddenAttributes)
    • 普通の Hash (permitted? メソッドがない) だとスルー
  • 削除されてしまったパラメータが存在したときの挙動を設定できるようになっている
    • ログに削除したパラメータ名を出力する、もしくはエラーを吐く
    • デフォルトは development と test 時にログ出力。他はなにもしない
  • require メソッドで例外出たときのデフォルトのレスポンスが設定されている(ステータスコードは400)

次回予告

次回は「実践!turbolinks」と銘打ち、turbolinks を実際に動かしてみて、ちゃんと使えそうなのか、どういうときにハマりそうなのかを勉強する予定です。まだ doorkeeper にイベント登録されていないので、気になる方は開催通知を受け取れるようにしておいてください。日にちは今のところ8/20(火)を予定しています。

Ginza.rb | Doorkeeper