表題のとおりで、fetch(...)
はエントリが存在しないと例外を投げるため、エントリが存在しないときに nil
を返すアクセサよりもtypoに対して安全です。
こういうのは rubocop-rails でカバーできるといいなと思って起票して、良さそうというコメントはもらったんですが:
https://github.com/rubocop-hq/rubocop-rails/issues/42
いかんせん rubocop-hq/rubocop-rails 自体がまだ開発中なのでいつ使えるかわかりません。
こういうときにquerlyを使うといいですね。
(cf. プロジェクト固有のルールを指定できるLinterであるところのQuerlyがめちゃ便利 - Islands in the byte stream)
というわけでruleはこんな感じです。
rules: - id: kibela.prefer_fetch_for_rails_secrets pattern: subject: "Rails.application.'credentials.'key()" where: key: '/.+/' credentials: '/(?:secrets|credentials)/' message: "`Rails.application.secrets.fetch(...)` を使いましょう。" before: - "Rails.application.secrets.foo" - "Rails.application.credentials.foo" after: - "Rails.application.secrets.fetch(:foo)" - "Rails.application.credentials.fetch(:foo)"