5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Railsで動的にroutesを追加する

Last updated at Posted at 2015-12-08

本当はやっちゃいけないことだけど、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生やすのがどうしても気に入らなかったのでやってみました。と言う内容でした。
他にいい方法知ってる人がいたら教えてください〜

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?