
初心者がRailsのコードリーディングに挑戦 #9
以前見たこちらの記事を参考に、Railsのコードリーディングに挑戦してみたいと思います。
◇ 前回までの記事一覧
コードを読む
の続きから!

前回は上記の画像の赤線部(defaults = attributes.extract_options!.dup)について詳しく見ていきました。
前回あれだけ書いたことが、このたった1行に凝縮されていると思うと恐ろしいですね。
次はその1行下の、validations = defaults.slice!(*_validates_default_keys)を見ていくようです。defaultsはさっきの変数ですね。
sliceというのは “配列や文字列から指定した要素を取り出すことができるメソッド” とのこと。
そして!が付いてslice!になることで、 “配列や文字列から指定した要素を切り取ることができるメソッド”になるようです。
slice!
例えば以下のようなイメージのよう。
array = [0, 1, 2, 3, 4, 5]
num = array.slice!(1)
として、
puts num
=>1
puts array
=>0, 2, 3, 4, 5
次は(*_validates_default_keys)について。
コンソール画面でnextと入力すると、左端の矢印をひとつ下げる事ができます。

さらにstepと入力すると、_validates_default_keysというメソッドが定義されている場所を見る事が出来ます。

メソッドの中に書いてある:if, :unless,〜などはバリデーションのオプションのようです。
バリデーションのオプション
なのでvalidationsはdefaultsから該当するバリデーションのオプションを切り出したものということですね。(ここ違いました。詳しくは下に。)
そして、defaultsはslice!によって切り取られたオプション以外のバリデーションということですね!
試してみます。
確認用のRailsプロジェクトに追記したバリデーションは今はこんな感じです。

特にオプションは付いていないので、コンソールで表示してもらうとこんな感じ。
※108行目の処理が終わった後でないと正しく表示されなかったです。110行目までnextで進めてから以下を入力しました。

むーん。さっき言ってた事の逆になってますね。
なんでだろう。
_validates_default_keysに*が付いている事が関係している?
色々調べていたらそれっぽい記事を見つけました ↓
slice!(*_validates_default_keys)

ここでslice!(*keys)というメソッドを定義してあるんですね。
コメントアウトの部分が使い方の説明みたいです。
hash = { a: 1, b: 2, c: 3, d: 4 }
hash.slice!(:a, :b) => {:c=>3, :d=>4}
hash => {:a=>1, :b=>2}
hash.slice!(:a, :b)の結果は、aとbが無くなったcとdだけになっていますね。
これなら納得です!
validationsはdefaultsから該当するオプションを消したもの。
defaultsはslice!によって切り取られたオプションですね。
よしよし。
ではオプションをつけてみます。

これでvalidationsとdefaultsがどうなったか見てみます。

validationsは:unlessオプション以外の部分(:length=>{:maximum=>30})になっていて、defaultsは:unlessオプションになっていますね。
ふう。難しかった(-.-;)
こうやって1行ずつ解読していくのが “ソースコードを読む” という事なんですね。
どこまでやるかが悩みものです。
とりあえず次回残り2行をやって、その後は一旦SQLiteの勉強に移ろうかなと思っています。
やる気維持のため!
がんばります!