メソッド:layout_for_namespaceを使用します。バックエンドが名前空間「admin」を使用しているため、フロントエンドまたはバックエンドのどちらにいるかに応じて、アプリのレイアウトを設定します。
私がどの名前空間であるかを見つけるためのきれいな方法が見つかりませんでした。私が見つけた唯一の方法は、params [:controller]から文字列を解析することです。もちろん、それは簡単で、フェイルセーフで機能しているようです。しかし、私はこれを行うためのより良い、準備された方法があるかと思っています。誰か知っている?
現在、私は次の方法を使用しています:
def is_backend_namespace?
params[:controller].index("admin/") == 0
end
前もって感謝します
アルネ
以下を使用できます。
self.class.parent == Admin
コントローラーの外側(ビューなど)では、controller.class.nameを使用します。これを次のようなヘルパーメソッドに変換できます。
module ApplicationHelper
def admin?
controller.class.name.split("::").first=="Admin"
end
end
コントローラとビューの両方で、controller_pathを解析できます。例:
namespace = controller_path.split('/').first
それほどエレガントではありませんが、paramsハッシュの代わりにクラスを使用します。解析せずにこれを行う「準備された」方法は知りません。
self.class.to_s.split("::").first=="Admin"
これらのソリューションはいずれも、複数の親モジュールを持つ定数を考慮していません。例えば:
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]
アプリケーションコントローラで名前空間を設定する:
path = self.controller_path.split('/')
@namespace = path.second ? path.first : nil
Rails 6では、コントローラクラスにnamespace
メソッドがないようです。
見た目が最もきれいで私にとってはうまくいった解決策は次のとおりです:controller.class.module_parent
具体的には、ネームスペースがAdmin ::で、「admin」が必要な場合は、次のようにします:controller.class.module_parent.to_s.downcase