2011-12-15 62 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,然後可以查看)

相關問題