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

时间:2010-11-19 15:41:29

标签: ruby-on-rails ruby-on-rails-3 namespaces actioncontroller

使用方法:layout_for_namespace我设置应用程序的布局取决于我是在前端还是后端,因为后端使用名称空间“admin”。

我找不到一个很好的方法来找出我是哪个命名空间,我找到的唯一方法是解析来自params [:controller]的字符串。当然这很容易,似乎是安全的,并且运行良好。但我只是想知道是否有更好的,准备好的方法来做到这一点。有谁知道吗?

目前我只使用以下方法:

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

提前致谢

·阿尔

8 个答案:

答案 0 :(得分:38)

您可以使用:

self.class.parent == Admin

答案 1 :(得分:27)

在控制器外部(例如在视图中),使用controller.class.name。您可以将其转换为这样的辅助方法:

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

答案 2 :(得分:18)

在控制器和视图中,您可以解析controller_path,例如:

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

答案 3 :(得分:12)

没有更优雅,但它使用类而不是params哈希。如果没有一些解析,我不知道有一种“准备好”的方法。

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

答案 4 :(得分: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与#deststantize相反:

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

如果您确实需要手动执行此操作,请尝试以下操作:

constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]

答案 5 :(得分:7)

在应用程序控制器中设置命名空间:

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

答案 6 :(得分:4)

Rails 6 中,控制器类似乎没有$vehicle = Vehicle::find($id); $vehicle->cars = $vehicle->cars->groupBy('car_id'); 方法。

在我看来,最干净,最适合我的解决方案是:namespace

具体来说,如果您的命名空间是Admin ::并且您想使用“ admin”,则可以执行以下操作: controller.class.module_parent

答案 7 :(得分:0)

路轨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