web-dev-qa-db-ja.com

Rails 3:現在のネームスペースを取得しますか?

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

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

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

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

前もって感謝します

アルネ

34
arnekolja

以下を使用できます。

self.class.parent == Admin
40

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

module ApplicationHelper
  def admin?
    controller.class.name.split("::").first=="Admin"
  end
end
27
BoosterStage

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

namespace = controller_path.split('/').first
18
KenB

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

self.class.to_s.split("::").first=="Admin"
11
johnmcaliley

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

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]
11
Jason Harrelson

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

path = self.controller_path.split('/')
@namespace = path.second ? path.first : nil
7
Danny

Rails 6では、コントローラクラスにnamespaceメソッドがないようです。

見た目が最もきれいで私にとってはうまくいった解決策は次のとおりです:controller.class.module_parent

具体的には、ネームスペースがAdmin ::で、「admin」が必要な場合は、次のようにします:controller.class.module_parent.to_s.downcase

0
staxim