本当はやっちゃいけないことだけど、Engineのテストとかするときにテストの間だけRoutesを追加したいっていうことがある。
良い子は絶対に真似しないでください
結論
Rails.application.routes.disable_clear_and_finalize = true
Rails.application.routes.draw do
get "awesome", to: "hatobin/awesome#index"
end
Rails.application.routes.disable_clear_and_finalize = false
または
Rails.application.routes.send(:eval_block, ->{ get "awesome", to: "awesome#index" } )
こう書くとできる。
解説
良い子なら普段、
Rails.application.routes.draw do
end
こんな感じでroutesを定義してると思います。
実はこのdrawメソッド、デフォルトだと呼ばれるたびに以前までに定義していたroutesをクリアするので、準備なしに後から呼ぶと大変なことになります。
disable_clear_and_finalizeはフラグで、こいつの評価結果を真にしてあげればクリアしなくなります。
または、ブロックを書いて直接評価させる、と言う方法をとっています
ぶっちゃけroutes.rbにif Rails.env.test?
とかすればいいじゃんって感じなんですけど、テストのためだけにroutes生やすのがどうしても気に入らなかったのでやってみました。と言う内容でした。
他にいい方法知ってる人がいたら教えてください〜