コールバックメソッド完全に理解した(してない)

昨日の続き。

kurehajime.hatenadiary.com

Active RecordやControllerのコールバックの仕組みがどうやって動いているのか分からないという疑問について、Railsのソースを読んでいたら60%くらい謎が解けてきたような気がしてきた。

ActiveSupport::Callbacks

github.com

こいつが正体だった。

ActiveSupport::Callbacksをincludeして

define_callbacks :save

と書けばそれに対するbeforeとかafterのコールバックを装備できるようになる。

しかし自動的にコールバックが起動するわけではない。 コールバックを挟みたい処理の中でrun_callbacksを実行してあげる必要がある。 渡すブロックは、本来そのメソッドでやりたかった処理の本体。

def save
  run_callbacks :save do
    # ★save処理本体★
  end
end

なるほど、そういう仕組みか。

種が分かれば「魔法」は「高度に発達した科学」になる。

しかしまだ消化不良。これはちゃんと体系的な本で勉強しないと駄目だなぁ。

Rails チュートリアルを(12章まで)進めた

内容的には11章の延長みたいな章だった。

初出ではないけれど、今回はコールバックメソッドに感銘を受けた。

コールバックメソッド

「before_actionってrubyの仕組み?railsの仕組み?」と疑問に思って調べてみたところ、railsの仕組みらしい事がわかった。 「modelのbeforeなんたらと言い、言語仕様に無いのにどんな魔法を使って実現してるんだ?」…と思ったけど、たぶんControllerの場合はルーティングの際に仕掛けを仕込んでいて、Modelについてはそもそも共通メソッドのsave等に限定してるから実現可能なのか。ということはControllerのメソッドを直接叩いたら作動しないのかな。

だんだんとrubyメタプログラミングが強いと言われている事に、実感が追いついてきた。
言語仕様だけではなく、文化的なところもあるのかも知れない。

追記

コールバックメソッドの仕組みは「言語仕様に無い」と思ってたけど、もしかしたらちょっと違うかもしれない。

www.techscore.com

rubyに標準で備わっているalias_methodの仕組み(を応用したalias_method_chain)を使っているのかも知れない。

もしくはこっち?

tech.ga-tech.co.jp

うーん分からない。
コールバックメソッドの正体について、もうちょっと詳しく調べてみよう。

プレスコットのピクルス原理

プレスコットのピクルス原理』という言葉を知った。

「漬け水がキュウリに漬かるよりは、キュウリが漬け水に漬かるほうが早い」ということらしい。

「自分がこの環境を変えてやる!」と思ってもそう簡単に変えられるもんじゃない。それより違う環境に移ったほうが早い…という意味。

これ、自分もちょうど最近同じようなこと思った。喉まで出かかったけど言葉にするのを我慢した。去っていく人間が去り際にそれを言っちゃいけない気がして…。

 

まぁそれはそうとして、この話、ジレンマもあるよなぁ、とも思った。

環境に染まりやすい体質の人は、そもそも環境を「変えよう」とも「替えよう」とも思わない。 だから環境を「変える」または「替える」人は、染まりにくい体質を持った人だと思う。 そういう人が別の環境に移った時、それが染まるに相応しい好ましい環境だったとしても、その体質ゆえに染まりにくいんじゃないかと。

うーん、それでは困る。自分的にはその仮説、都合が悪い。
最初から望ましい瓶の中に漬けられてるキュウリが一番って話になる。
それではあんまりだ。

とりあえず、その時その時に応じて良い方向に進むよう、自分を改造していくしかないなぁ。

最近読み始めた漫画『天の血脈』

世間では初代『機動戦士ガンダム』のキャラクターデザインをした人として知られる安彦良和の漫画、『天の血脈』を読み始めた。

日本占領下の満州を描いた『虹色のトロツキー』は読んだことあったんだけど、『王道の狗』『天の血脈』と合わせて三部作みたいな位置づけだったとは知らなかった。

まだ最初の数巻しか読んでないので触りだけだけど、この『天の血脈』は、日露戦争が今にも始まりそうな時期の日本・朝鮮・満州が舞台で、大学教授に石碑の調査についていった学生である主人公が巨大な陰謀に巻き込まれるお話。

「その昔、天皇の母親が朝鮮に渡って戦争に参加したという記録が石碑に残っている」→「時期を考えたら天皇は朝鮮で妊娠した時の子だよね?」→「父親は朝鮮の王では?」→「つまり日本と朝鮮は兄弟国家」→「日朝はひとつの国になってロシアと戦おう!」

というやや強引な歴史の解釈で朝鮮併合を目論む計画が出てきたりと、色んな意味でハラハラするストーリー。

虹色のトロツキー』の題材となった満州国もだけど、このあたりの歴史ってまさに侵略の歴史であり、日本人の自分からすれば後ろめたい歴史ではあるんだけど、それ故に知識が浅くて新鮮味もあり、そしてこれはいけない事ではあるんだけど、背徳感に甘美さも感じてしまう。

用法用量を守って部屋を明るくして離れて読まないと危険な漫画だ。

Rails チュートリアル11章が(やっと)終わった

昨日のyarnのエラーは寝て起きたら治った。
やっぱりそういうものだった。
世の中だいたいの問題は寝て起きたら治る。
睡眠はあらゆる問題を解決する。

そしてその先でまた躓く。

本番環境でメールを送るとエラーになる。 このメールサービスはどうやら、あらかじめ登録しているメールアドレスじゃないと送れないらしい(本格運用するなら制限を開放できる)。さっそくアドレスを登録して認証。

登録に使ったメールアドレスはDBに追加済みだったので、新規登録をもう一度試す為にheroku run rails:db:migration:resetするがエラー。production環境ではそういう危なっかしいコマンドは初期設定だとブロックされるらしい。

その後heroku側の仕組みを使ってDBをリセットしたりと四苦八苦して、何とか11章の仕組みが上手く動くことを確認できた。途中仕事が忙しかったのもあるけど、長かった。次は12章。

今回はこのあたりのサイトを参考にした。ありがたや。

qiita.com

ktmry.hatenablog.com

Rails チュートリアル11章が終わった…か?

いや、終わってない。

herokuにデプロイしたらyarnでこける。

remote:        Running: rake assets:precompile
remote:        yarn install v1.22.4
remote:        [1/4] Resolving packages...
remote:        [2/4] Fetching packages...
remote:        info There appears to be trouble with your network connection. Retrying...
remote:        info There appears to be trouble with your network connection. Retrying...
remote:        info There appears to be trouble with your network connection. Retrying...
(略)

npm周りは特に変えてないので、いわゆる「何もしてないのに壊れた」な状態。自称だが。

とりあえずネットワーク絡みの問題のようにも見えるので、寝る。今日は寝る。

明日試して駄目ならいろいろ調べてみる。

Rails チュートリアルが11章が(まだ)終わらない

今週はワクチンで数日ダウンしていた。

Railsチュートリアルの進みは遅々としているが、ちびりちびりと進めている。

切りのいいところで記録に残すつもりだったが、何も書かないまま一週間が経つのもなんなので、ここら辺でひとまず残しておく。

動的ディスパッチ

動的ディスパッチ自体はいろんな言語にあるけど、それを「send」と表現するのは伝統的なオブジェクト指向っぽい感じがする。smalltalkっぽいというか。rubyでメソッドを呼び出す時にカッコではなくコマンドのようにスペース区切りで引数を渡す表記が好まれるのも、その辺りを意識しているのだろうか。

togetter.com

まぁでもsmalltalkの影響は作者本人が概ね否定しているようだ。