Rails 3:获取当前命名空间?

使用方法: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