RailsのRoutingの名前付けでハマった
Astrum などのスタイルガイドジェネレータを利用する際、Railsの外からコンパイル済みCSSを読み込みたいことがある。
このとき、アセットパイプラインを利用している場合はdigestを含めて参照する必要があるのだが、Railsの外の世界で、かつ変更に開いていない場合いい感じにdigestを埋め込むことができない。
そこで今回はRailsのコントローラ経由でCSSをリダイレクトしてしまうアイデアで実現したのだが、Routingのリソース名でハマった。
class AssetsController < ApplicationController def show redirect_to helpers.stylesheet_url('hogehoge') end end
resource :asset, only: :show
こうするとなにがまずいかというと、 asset_url
が上書きされてしまうのだ。
従って一部のアセットが正しく取得できなくなる。 SassのURLヘルパーもこのメソッドを利用しているので 1、CSSに埋め込んだimageやfontが軒並み表示されてなくて謎だった。
かなりレアケースではあると思うが2、Railsでは内部で使われていそうな名前のRoutingは避けようという教訓を得た…。
そして、こういうときにfinalistのような意図しないoverrideを防ぐ手段があればなあと思うのであった。ただ、Ruby, Rails的には受容されない気もするが。
Routingに限らず、動的生成されるメソッドには油断しないようにしたい。