見出し画像

初心者が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)

Railsソースコードのこの部分の事が書いてありました!

ここで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!によって切り取られたオプションですね。

よしよし。
ではオプションをつけてみます。

unless: “name.nil?”を追記しました。

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

なぜか入力したdefaultsが消えてしまったので分かりづらいですが、白線より下がdefaultsの結果です。

validationsは:unlessオプション以外の部分(:length=>{:maximum=>30})になっていて、defaultsは:unlessオプションになっていますね。


ふう。難しかった(-.-;)
こうやって1行ずつ解読していくのが “ソースコードを読む” という事なんですね。
どこまでやるかが悩みものです。
とりあえず次回残り2行をやって、その後は一旦SQLiteの勉強に移ろうかなと思っています。
やる気維持のため!

がんばります!

この記事が気に入ったらサポートをしてみませんか?