假設控制器名稱爲TemplateUserController
,其型號等級爲TemplateUser
。Ruby on Rails:如何從Controller內部獲取Model名稱?
現在,我可以做self.name.tableize.singularize.string_manipulation…
但這似乎有點過分......我想知道是否有更快的方式從控制器獲取模型名稱。謝謝! = D
假設控制器名稱爲TemplateUserController
,其型號等級爲TemplateUser
。Ruby on Rails:如何從Controller內部獲取Model名稱?
現在,我可以做self.name.tableize.singularize.string_manipulation…
但這似乎有點過分......我想知道是否有更快的方式從控制器獲取模型名稱。謝謝! = D
更直接的方式做這個:controller_name.classify
。
您可能知道,您無法保證控制器和模型之間的1對1映射。
然而,在情況下,你可以,CanCan
是需要做的,你以後是同樣的事情的寶石,它確實是這樣的:
def model_name
params[:controller].sub("Controller", "").underscore.split('/').last.singularize
end
因爲沒有一個隱含的模型和控制器之間的聯繫(除了慣例),根據控制器名稱做出自己的判斷是唯一的方法。
但是,假設我需要從控制器名稱獲取模型名稱的所有實例,型號名稱是控制器名稱...我會怎麼做?我會使用你的方法與.sub,但我做了一些用戶友好的URL映射,它掩蓋了我在某些情況下使用哪個控制器(基本上擺脫下劃線和其他整潔的東西) – NullVoxPopuli
params[:controller]
#=> "TemplateUserController"
params[:controller][/.*[^Controller]/]
#=> "TemplateUser"
params[:controller]
#=> "UsersController"
params[:controller][/.*[^Controller]/].singularize
#=> "User"
是的 - 在現實世界中有很多的控制器不涉及
PS
模型Istead的params[:controller]
可以使用Rails.controller
謝謝,Rails.controller是我正在尋找的是= D(我甚至不知道如何獲得控制器名稱(我目前正在儘可能多地抽取我的應用程序......越少代碼越好......)更多評論我認爲這是好的) – NullVoxPopuli
問題,我接受的太早了。我得到這個錯誤:NoMethodError:未定義的方法'控制器'的Rails:模塊 這是一個rails 3的東西嗎?我在2.3.8 – NullVoxPopuli
好吧,然後使用'params [:controller]'爲最老的Rails – fl00r
@Sam
controller_name.classify.constantize
的解決方案適用於所有控制器,雖然很多像我一樣的人可能不得不查找文檔以認識到「控制器」不是名稱的一部分。
如果你的控制器要控制一個模型,你應該考慮使用inherited_resources。你得到很多好處,其中之一是方法resource_class
:
class TemplateUserController < InheritedResources::Base
resource_class # => TemplateUser
end
然後,爲了得到我剛剛添加的類.constantize在最後= D – NullVoxPopuli