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

问题描述 投票:31回答:7

使用方法:layout_for_namespace,我根据在前端还是后端来设置应用程序的布局,因为后端使用的是命名空间“ admin”。

我找不到找到我是哪个名称空间的好方法,我发现的唯一方法是通过解析params [:controller]中的字符串。当然,这很容易,似乎很容易出错,而且运行良好。但是我只是想知道是否有更好的,准备好的方法来做到这一点。有人知道吗?

当前我正在使用以下方法:

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

提前感谢

Arne

ruby-on-rails ruby-on-rails-3 namespaces actioncontroller
7个回答
41
投票

您可以使用:

self.class.parent == Admin

27
投票

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

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

18
投票

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

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

11
投票

不太优雅,但是它使用类而不是params哈希。我不知道在不进行某些分析的情况下“准备好的”方法。

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

11
投票

这些解决方案均未考虑具有多个父模块的常量。例如:

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]

7
投票

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

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

0
投票

Rails 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

© www.soinside.com 2019 - 2024. All rights reserved.