読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

【自習メモ】railsのmatchの挙動

rails

私のようなRails若葉マークにとって、matchメソッドは救いの女神です。
雑に書いても、雑に補足してくれます。
とは言え、規模が大きくなってくるとそうも言っていられなくなります。
今回は、そんなこんがらがった糸を解す過程のメモです。

実際のところ

HTTPリクエストに応じた処理

お行儀よいのはHTTPリクエストを明示した上でやる方法。

get  'photos/show' => 'photos#show'

まぁ引き継ぎプロジェクトだったり、マウンテンサイクルから出土した黒歴史の遺産だったりして、
手がつけれれないケースはありますよね。
そんなアナタにはmatchで雑に補足し、viaで詳細に決める方法。

match 'photos/show' => 'photos#show', :via => :get

viaには複数のリクエスト種類に対応することもできます。
美しくないルート設計を一時しのぎでこなすならモッテコイ。

match 'photos/show' => 'photos#show', :via => [:get, :post]

更に……XSS上等! 楽がしたいんじゃーって場合は:allなんて手も

match 'photos/show' => 'photos#show', :via => :all

どれも、あくまで一時しのぎなので、ちゃんとリファクタリングしないと皆で不幸になること請け合いです。

正規表現

パラメータに対する反応を値毎に変えたい場合、正規表現って手もあります。
やり方は二通り。
constrainsオプションをつかってやるか。

match 'photos/:id' => 'photos#show', :constraints => { :id => /[A-Z]\d{5}/ }

可変パラメータを直接呼び出すか。

match 'photos/:id' => 'photos#show', :id => /[A-Z]\d{5}/ 

前者の場合、渡すのがブロックなので魔界記法的な事ができますが……割愛します。
ソースコードを見る限り、最新版でも有効なオプションです。
rails/mapper.rb at f5d2f3fc759ec9a942609ca5b8446e83fdf869b4 · rails/rails · GitHub