![見出し画像](https://assets.st-note.com/production/uploads/images/119883414/rectangle_large_type_2_51c4ef74edf4bb37d43a875e91488706.png?width=1200)
初心者がRailsのコードリーディングに挑戦 #9
以前見たこちらの記事を参考に、Railsのコードリーディングに挑戦してみたいと思います。
◇ 前回までの記事一覧
コードを読む
の続きから!
![](https://assets.st-note.com/img/1698200553536-5HTEn1yuGt.jpg?width=1200)
前回は上記の画像の赤線部(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と入力すると、左端の矢印をひとつ下げる事ができます。
![](https://assets.st-note.com/img/1698222216784-2fwoKPgPQj.png?width=1200)
さらにstepと入力すると、_validates_default_keysというメソッドが定義されている場所を見る事が出来ます。
![](https://assets.st-note.com/img/1698222658743-GniHurPLCN.png?width=1200)
メソッドの中に書いてある:if, :unless,〜などはバリデーションのオプションのようです。
バリデーションのオプション
なのでvalidationsはdefaultsから該当するバリデーションのオプションを切り出したものということですね。(ここ違いました。詳しくは下に。)
そして、defaultsはslice!によって切り取られたオプション以外のバリデーションということですね!
試してみます。
確認用のRailsプロジェクトに追記したバリデーションは今はこんな感じです。
![](https://assets.st-note.com/img/1698223716720-qcW2Y7sCPg.png)
特にオプションは付いていないので、コンソールで表示してもらうとこんな感じ。
※108行目の処理が終わった後でないと正しく表示されなかったです。110行目までnextで進めてから以下を入力しました。
![](https://assets.st-note.com/img/1698226506040-uGmNLEmOko.png)
むーん。さっき言ってた事の逆になってますね。
なんでだろう。
_validates_default_keysに*が付いている事が関係している?
色々調べていたらそれっぽい記事を見つけました ↓
slice!(*_validates_default_keys)
![](https://assets.st-note.com/img/1698234776639-a0LB47i3CZ.png?width=1200)
ここで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!によって切り取られたオプションですね。
よしよし。
ではオプションをつけてみます。
![](https://assets.st-note.com/img/1698224002027-gcejEUTn3w.png)
これでvalidationsとdefaultsがどうなったか見てみます。
![](https://assets.st-note.com/img/1698226152357-EQa7frLeCQ.jpg)
validationsは:unlessオプション以外の部分(:length=>{:maximum=>30})になっていて、defaultsは:unlessオプションになっていますね。
ふう。難しかった(-.-;)
こうやって1行ずつ解読していくのが “ソースコードを読む” という事なんですね。
どこまでやるかが悩みものです。
とりあえず次回残り2行をやって、その後は一旦SQLiteの勉強に移ろうかなと思っています。
やる気維持のため!
がんばります!
この記事が気に入ったらサポートをしてみませんか?