19

Railsアプリの起動時にクラス属性を設定したい。一部のルートを検査する必要があるため、カスタムコードを実行する前にルートをロードする必要があります。信頼できる場所を見つけるのに苦労しています。

これは、「テスト」環境で完全に機能します。

config.after_initialize do
  Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end

ただし、「開発」環境では機能しません(ルートは空です)

今のところ、config.to_prepareすべてのリクエストの前に発生することを理解しているのと同じコードを実行することで、開発モードで動作しているようです。残念ながら、to_prepare単独で使用することはテストモードでは機能しないようであるため、重複します。

テストモードではafter_initializeの前にルートがロードされるのに、開発モードではロードされないのはなぜか知りたいです。そして本当に、これのための最良のフックは何ですか?すべての環境で機能する単一のフックはありますか?

*編集*

ルートをリロードするというmuの提案は素晴らしかった。これにより、すべての環境でafter_initialize内のルートに一貫してアクセスできるようになりました。ただし、私のユースケースでは、モデルにクラス属性を設定していて、各リクエストの前にモデルが再ロードされるため、to_prepareからもコードを実行する必要があると思います。

これが私がやったことです。

[:after_initialize, :to_prepare].each do |hook|
  config.send(hook) do
    User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
  end 
end 

それは私には少し厄介なようです。私はむしろ次のようなことをしたいと思います:

config.after_initialize do
  User.exclude_routes_from_usernames!
end

config.to_prepare do
  User.exclude_routes_from_usernames!
end

しかし、それUserが調査するのに適切な場所であるかどうかはわかりませんRails.application.routes。lib /のコードでも同じことができると思いますが、それが正しいかどうかもわかりません。

もう1つのオプションは、to_prepareにmuの提案を適用することです。それは機能しますが、私の開発環境ではすべてのリクエストでルートのリロードに顕著な遅延があるようです。したがって、少なくともDRYですが、これが適切な呼び出しであるかどうかはわかりません。

config.to_prepare do
  Rails.application.reload_routes!
  User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
end
4

2 に答える 2

29

Rails.application.routesこれを見る前に、ルートを強制的にロードすることができます。

Rails.application.reload_routes!

だからあなたの中でこれを試してみてくださいconfig/application.rb

config.after_initialize do
  Rails.application.reload_routes!
  Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end

私は(ルートとの競合について)ルートをチェックするために必要な同様のことをしました、そして私はあなたがしているのと同じようにとチェックを/:slug入れることになりました。reload_routes!config.after_initialize

于 2012-01-03T03:47:25.213 に答える
3

ルートがロードされた後にイニシャライザでコードを実行しようとしている場合は、次のafter:オプションを使用してみてください。

initializer "name_of_initializer", after: :add_routing_paths do |app|
  # do custom logic here
end

初期化イベントはここにあります:http://guides.rubyonrails.org/configuring.html#initialization-events

于 2016-03-06T05:31:07.607 に答える