1

我知道controller_name返回包含控制器名称的字符串,但是如何从帮助程序中检索控制器类(或对象)?

编辑:当控制器被命名空间时,该解决方案也应该起作用(例如。Admin::PostsController

4

3 回答 3

3

您可以使用该constantize方法,例如:

controller_name.constantize

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

更新:

那个不适用于所有控制器名称和/或命名空间。虽然可以#controller结合使用该方法#class

controller.class
于 2011-12-15T08:57:43.780 回答
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

编辑:如果你真的想让控制器名称不解调,那么这段代码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
于 2011-12-15T10:06:28.580 回答
1

视图可能不需要这样做。理想情况下,无论您在期望的视图中尝试做什么,都应该在控制器中执行。

尝试考虑为什么要这样做,我能想到的最佳答案是您想调用您在控制器中定义的辅助方法。已经存在执行此操作的构造,请使用helper_method

对于几乎任何其他事情,控制器应该将该数据提供给视图。不是将其拉出控制器的视图。(例如,即使您不需要该类,控制器也可以为其提供@controller_class = self.class,然后视图可以使用该类)

于 2011-12-15T11:05:25.440 回答