コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsのroutesはスクリプトを書いて凝った記述でフィルタリングすることができる

へー、こんな書き方ができるんだというメモ

環境

$ 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だけでは完結しないという読みにくさもでる
  • 一長一短、かつチームの練度によるので使う方針は精査したほうがいいかも

参考リンク