実装を直すのじゃなくて問題が起きないように直す

  • ARTICLES
文字列からリンクで開いて次のページへ進むというのが必要な場面で文字列が空のためリンクがクリックできず、意図した動作ができないというバグがあった。 実装をそのまま修正すると、 if name.present? link_to name, some_path(object) else link_to another_name, some_path(object) end てなかんじで、起きたバグに対処するように直す。 でも、自分で開発しているときはこういうのは不安があって、そもそも name が空文字や nil だというのも自分が想定してなかったからバグが出ている。 どうせ修正をするなら、ここでけして同じ種類の問題が起きないように直したい。 ということで、こんな風に直す。 name_candidates = [name, another_name, 'fallback name'] visible_name = name_candidates.find {|n| n.to_s.length > 0 } link_to visible_name, some_path(object) ここでの問題は実装上は present? かどうかというものだったけれど、意味上は空文字列だと表示がされずリンクが有効に働かないということ。なので、その問題を解消するようなコードにしておく。 これで、絶対に同種の問題は起きない修正になったと安心できる。 「fallback name となってしまうケースがそのまま表示され次に進めていいのか」というのはまた別の問題としてあって、それをケアするのならまた別のそれに適した場所で対応をしてやるといい。 細かい話ではあるんだけど、わりと「実装上のつじつまはあってる」というコードで push されているコードをよくみるので書いてみた。

Netlifyで Deploy previews に認証をかけたい

  • ARTICLES
仕事で聞く要望のうちいくつかは CMS 使うほうが今後のメンテが楽そうだなと感じる機会がよくある。Hugo でサイトを構築するとして、動かすのはなるべく楽に面倒見ずにすませたい。でも独自ドメインだったりある程度機能は求めたい。というわがままを Netlify なら叶えてくれるんじゃないかということで Netlify を試している。 その中で、本番はいいんだけど動作確認用の環境をどうしようかなーというので迷って Deploy previews で対応したことの記録。結論には Business plan で有効になる site access control by roles が必要なので仕事とはいえお金は Pro までしかかけられないという場合は使えないけど、そういうときはトレードオフで URL がばれなきゃいいっしょの精神でいけばいいと思う。 なお、同じ会社で Netlifyが仕事で使えるか試す(追記あり) という方法でやっている話へのアンサーソングでもある。 やりたいこと まずやりたいことから。 Netlify で動作確認をする環境は public に見える状態を避けたい Netlify を使う動機がリポジトリをつくったらあとはなるべく環境構築やその後のデプロイの手間をかけたくないというものなので手間かけたくない 本番となるべく近い形で動作の確認をしたい 考えてたこと 同じ会社で同僚が似たことをやっていたのでまずはその repo を見たり、軽く話を聞いたりしてたんだけど、好みからいくと本人も書いているとおり “しかし、Productionはデプロイの方法を別で作っておかないといけないという面倒なことになってしまう。つらいね。” についてはだいぶ後で嫌になりそうで回避したいなと感じたのと、Heroku で Review Apps の便利さを享受したことのある身としてはぜひ Deploy previews を活かしてやりたい。そして、環境に応じたあれこれをビルド時に考慮してやれば稼働環境は同一でいけそうな気がするので Selective Password Protection のやり方は筋がよさそうに感じる (というか Basic 認証ならこれでいい)。 ということで、 Identity と Visitor Access Control を使ってやってみた。 やってみたこと Makefile じゃなくて rake でやりたいなーとごちゃごちゃやった結果、 Makefile で書くのが一番シンプルだったというサンプル があるのでこのコードを見ながらやってみたことを解説。 環境ごとにビルドを変える (production/deploy-preview) 環境ごとのビルドについては Selective Password Protection に倣って netlify.toml で制御した (repo では rake でやってるが困るまで make でいいと思う)。