へー、こんな書き方ができるんだというメモ
環境
$ bin/rails -v
Rails 5.2.2.1
やり方
※Rails のルーティング - Rails ガイド より引用
routes.rbには以下のように書く
Rails.application.routes.draw do get '*path', to: 'blacklist#index', constraints: BlacklistConstraint.new end
そして以下のようなクラスをつくる、置き場はapp以下のお好みの場所で。
class BlacklistConstraint def initialize @ips = Blacklist.retrieve_ips end def matches?(request) @ips.include?(request.remote_ip) end end
と記述するとmatches?の戻り値がtrueだったら該当のルーティングが発動されるという仕組み。matches?は予め指定されているので能動的に指名するものではない。
個人的な考え方のメモ
- リクエストの中身を精査して見ることができるので表現の幅が広がる
- 一方、増えすぎるとroute.rbだけでは完結しないという読みにくさもでる
- 一長一短、かつチームの練度によるので使う方針は精査したほうがいいかも