我知道controller_name
返回一個包含控制器名稱的字符串,但是如何從幫助器中檢索控制器類(或對象)?如何從Rails 3中的視圖/幫助器中檢索控制器類?
編輯:當控制器命名空間(如:Admin::PostsController
)
我知道controller_name
返回一個包含控制器名稱的字符串,但是如何從幫助器中檢索控制器類(或對象)?如何從Rails 3中的視圖/幫助器中檢索控制器類?
編輯:當控制器命名空間(如: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
編輯:如果你真的想要得到控制器名稱未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
視圖可能不應該需要做的這個。理想情況下,無論你想要做什麼,你都會在控制器中做。
試圖思考爲什麼你想要這樣做,我能想到的最好的答案是你想要調用你在控制器中定義的幫助器方法。已經有一個構造來做到這一點,請使用helper_method。
對於其他任何東西,控制器應該將該數據提供給視圖。不是將視圖拉出控制器。 (例如,即使你不需要這個類,控制器也可以提供@controller_class = self.class
,然後可以查看)
`controller_name`沒有幫助,導致`Admin :: PostsController`只返回`posts `。確信它會返回不足以檢索控制器的「帖子」。 – Kostas 2011-12-15 10:46:43
你是對的!我只是在一個視圖中測試`controller.class`,它似乎工作,甚至命名空間。介意嘗試? – tbuehlmann 2011-12-15 11:04:53
這很棒,PLZ編輯你的答案是可以接受的。 – Kostas 2011-12-16 10:52:42