34

メソッド :layout_for_namespace を使用して、バックエンドが名前空間「admin」を使用しているため、フロントエンドかバックエンドかに応じてアプリのレイアウトを設定します。

自分がどの名前空間であるかを見つけるためのきれいな方法が見つかりませんでした。私が見つけた唯一の方法は、params[:controller] から文字列を解析することです。もちろん、それは簡単で、フェイルセーフでうまく機能しているようです。しかし、これを行うためのより良い、準備された方法があるかどうか疑問に思っています。誰か知っていますか?

現在、私は次の方法を使用しています。

def is_backend_namespace?
  params[:controller].index("admin/") == 0
end

前もって感謝します

アルネ

4

8 に答える 8

27

コントローラーの外側 (ビューなど) では、controller.class.name を使用します。これを次のようなヘルパー メソッドに変換できます。

module ApplicationHelper
  def admin?
    controller.class.name.split("::").first=="Admin"
  end
end
于 2011-04-19T15:16:48.047 に答える
19

コントローラーとビューの両方で、controller_path を解析できます。

namespace = controller_path.split('/').first
于 2012-01-25T14:48:05.497 に答える
11

それほどエレガントではありませんが、params ハッシュの代わりにクラスを使用します。解析せずにこれを行う「準備された」方法を知りません。

self.class.to_s.split("::").first=="Admin"
于 2010-11-19T18:58:57.557 に答える
10

これらのソリューションはいずれも、複数の親モジュールを持つ定数を考慮していません。例えば:

A::B::C

Rails 3.2.x では、次のことが簡単にできます。

"A::B::C".deconstantize #=> "A::B"

Rails 3.1.x 以降では、次のことができます。

constant_name = "A::B::C"
constant_name.gsub( "::#{constant_name.demodulize}", '' )

これは、#demodulize が #deconstantize の反対であるためです。

"A::B::C".demodulize #=> "C"

これを手動で行う必要がある場合は、次を試してください。

constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]
于 2013-01-03T19:25:22.890 に答える
9

アプリケーション コントローラーで名前空間を設定します。

path = self.controller_path.split('/')
@namespace = path.second ? path.first : nil
于 2012-04-14T20:34:25.473 に答える
2

レール6

ビューで名前空間にアクセスしていますか?

使用禁止:controller.namespace.parent == Admin

このparentメソッドは Rails 6.1 で削除されます

DEPRECATION WARNING: `Module#parent` has been renamed to `module_parent`. `parent` is deprecated and will be removed in Rails 6.1.

module_parent代わりに使用してください:

controller.namespace.module_parent == Admin

于 2019-11-26T16:22:59.477 に答える