如何在Ruby on Rails中以编程方式找到名称空间/模块名称?
时间:2020-03-06 14:43:15 来源:igfitidea点击:
如何在下面的过滤器中找到名称空间或者模块" Foo"的名称?
class ApplicationController < ActionController::Base def get_module_name @module_name = ??? end end class Foo::BarController < ApplicationController before_filter :get_module_name end
解决方案
这应该做到这一点:
def get_module_name @module_name = self.class.to_s.split("::").first end
我认为没有更清洁的方法,而我在其他地方也看到了
class ApplicationController < ActionController::Base def get_module_name @module_name = self.class.name.split("::").first end end
如果控制器确实具有模块名称,这将起作用,但如果没有模块名称,则将返回控制器名称。
class ApplicationController < ActionController::Base def get_module_name @module_name = self.class.name.split("::").first end end
但是,如果我们将其更改为:
class ApplicatioNController < ActionController::Base def get_module_name my_class_name = self.class.name if my_class_name.index("::").nil? then @module_name = nil else @module_name = my_class_name.split("::").first end end end
我们可以确定该类是否具有模块名称,然后返回可以测试的类名称以外的其他名称。
我知道这是一个旧线程,但是我碰到了需要根据控制器的命名空间进行单独导航的需求。我想出的解决方案是在我的应用程序布局中:
<%= render "#{controller.class.name[/^(\w*)::\w*$/, 1].try(:downcase)}/nav" %>
看起来有点复杂,但是下面的操作基本上需要使用控制器类名称,例如,对于没有命名空间的控制器,将为" People",对于命名空间的控制器将为" Admin :: Users"。将[]字符串方法与正则表达式一起使用,该正则表达式返回两个冒号之前的任何内容;如果没有,则返回nil。然后将其更改为小写(如果没有名称空间并返回nil,则存在" try")。然后,这给我们留下了名称空间或者nil。然后,它仅使用或者不使用名称空间(例如,不使用名称空间)呈现部分视图:
app/views/_nav.html.erb
或者在admin名称空间中:
app/views/admin/_nav.html.erb
当然,每个命名空间都必须存在这些部分,否则会发生错误。现在,将为每个控制器显示每个名称空间的导航,而无需更改任何控制器或者视图。