0

Rails 3.2 アプリケーションには管理パネルがあります。管理パネルはモジュールに分かれています。たとえば、 がありますAdmin::Searching。反復的でハードコーディングされたパーシャルをリファクタリングしたいと考えています。例えば:

<ul class='searching_nav'>
<% %w(tests fuzzy stats terms hits).each do |tab| %>
  <li class="<%= css_nav(tab) %>"><%= link_to tab.humanize, [:admin, :searching, tab] %></li>
<% end %>
</ul>

nav セクションを検索しています。別のコントローラーを追加した後、手動で変更する必要があります。 私が欲しいのは、すべてのコントローラーのリストを取得することですAdmin::Searching(この名前空間のコントローラーは のサブクラスですAdmin::AdminController)。Rails api からエレガントな方法でそれを行うことは可能だと思います。次に、すべてのモジュール タブに一般化できます。

私は Admin::AdminController.subclasses をチェックしようとしましたが、その配列のクラスは遅延ロードされるためTerms、たとえばサーバーの再起動後にヒットした後、要素は 1 つしかなく[Admin::Searching::TermsController]、他のモジュールにアクセスした後は他のコントローラーもあります。それらを繰り返し処理し、結果に基づいてコントローラーcontroller_pathのみをフィルター処理できます。admin/searchたぶん、ルートの端から可能ですか?つまり、Rails.application.routes.routes から、特定の名前空間にあるすべてのコントローラーを取得できますか?

ファイルシステムにアクセスしたくありません。admin/searching ディレクトリをスキャンできることはわかってDirいますが、非効率的です。

4

1 に答える 1

2

Module#constantsandの使用について説明した素晴らしい回答がありModule#const_getましたが、質問の後半まで読んで、この手法は機能しないのと同じ理由で機能しない可能性が高いことに気付きました。これAdmin::AdminController.subclassesは、Rails が必要に応じてコントローラ クラス。

あなたの場合、おそらくディレクトリスキャンを行うことになります。非効率だと思うかもしれませんが、Rails や多くの Ruby の gem は、動的ロードなどを行うときにファイル システムにアクセスすることになります。

ここで、とにかくロードされる前に、すべての(関連する) コントローラーを見つけたいと考えています。これを、本番環境ではコントローラーの数が変わらないという洞察と結び付けます。

私が言おうとしているのは、先に進んでDirスキャンを実行しますが、イニシャライザ ( の下のファイルconfig/initializers) で実行して、アプリの開始時に一度だけ実行されるようにすることです。

したがって、おそらく、

# config/initializers/admin.rb
module Admin
  CONTROLLERS = begin
    # Do a directory scan of app/controllers/admin looking for relevant files
  end
end
于 2013-02-07T14:10:27.160 に答える