2011-12-15 60 views

回答

3

可以使用constantize方法,如:

controller_name.constantize 

虽然我不知道如何它会表现如果你有一个命名空间的控制器。

更新:

那一个不会为所有的控制器名称和/或命名空间的工作。虽然人们可以使用组合#controller#class

controller.class 
+0

`controller_name`没有帮助,导致`Admin :: PostsController`只返回`posts `。确信它会返回不足以检索控制器的“帖子”。 – Kostas 2011-12-15 10:46:43

+1

你是对的!我只是在一个视图中测试`controller.class`,它似乎工作,甚至命名空间。介意尝试? – tbuehlmann 2011-12-15 11:04:53

+1

这很棒,PLZ编辑你的答案是可以接受的。 – Kostas 2011-12-16 10:52:42

1

在纯Ruby,因为类名称是常量,你可以做到这一点从字符串获取类:

classname = 'Posts' 
p Kernel.const_get(classname).methods 

有在Rails的只是这一个很好的快捷方式,constantize

p 'Posts'.constantize.methods 

如果类名是如“editable_file”,首先调用camelize方法:

p 'editable_file'.camelize.constantize # EditableFile 
p 'extensions/editable_file'.camelize.constantize # Extensions::EditableFile 

编辑:如果你真的想要得到控制器名称未demodulized,那么这段代码在config/initializers/controller_name.rb应确保:

class ActionController::Metal 
    def self.controller_name 
    # @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore 
    @controller_name ||= self.name.sub(/Controller$/, '').underscore 
    end 
end 
1

视图可能不应该需要做的这个。理想情况下,无论你想要做什么,你都会在控制器中做。

试图思考为什么你想要这样做,我能想到的最好的答案是你想要调用你在控制器中定义的帮助器方法。已经有一个构造来做到这一点,请使用helper_method

对于其他任何东西,控制器应该将该数据提供给视图。不是将视图拉出控制器。 (例如,即使你不需要这个类,控制器也可以提供@controller_class = self.class,然后可以查看)

相关问题