我知道controller_name
返回包含控制器名称的字符串,但是如何从帮助程序中检索控制器类(或对象)?
编辑:当控制器被命名空间时,该解决方案也应该起作用(例如。Admin::PostsController
)
我知道controller_name
返回包含控制器名称的字符串,但是如何从帮助程序中检索控制器类(或对象)?
编辑:当控制器被命名空间时,该解决方案也应该起作用(例如。Admin::PostsController
)
您可以使用该constantize
方法,例如:
controller_name.constantize
虽然我不确定如果你有一个命名空间控制器它会如何表现。
更新:
那个不适用于所有控制器名称和/或命名空间。虽然可以#controller
结合使用该方法#class
:
controller.class
在纯 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
视图可能不需要这样做。理想情况下,无论您在期望的视图中尝试做什么,都应该在控制器中执行。
尝试考虑为什么要这样做,我能想到的最佳答案是您想调用您在控制器中定义的辅助方法。已经存在执行此操作的构造,请使用helper_method。
对于几乎任何其他事情,控制器应该将该数据提供给视图。不是将其拉出控制器的视图。(例如,即使您不需要该类,控制器也可以为其提供@controller_class = self.class
,然后视图可以使用该类)