2011-07-13 73 views

回答

5

更直接的方式做這個:controller_name.classify

+1

然後,爲了得到我剛剛添加的類.constantize在最後= D – NullVoxPopuli

2

您可能知道,您無法保證控制器和模型之間的1對1映射。

然而,在情況下,你可以,CanCan是需要做的,你以後是同樣的事情的寶石,它確實是這樣的:

def model_name 
    params[:controller].sub("Controller", "").underscore.split('/').last.singularize 
end 

因爲沒有一個隱含的模型和控制器之間的聯繫(除了慣例),根據控制器名稱做出自己的判斷是唯一的方法。

+0

但是,假設我需要從控制器名稱獲取模型名稱的所有實例,型號名稱是控制器名稱...我會怎麼做?我會使用你的方法與.sub,但我做了一些用戶友好的URL映射,它掩蓋了我在某些情況下使用哪個控制器(基本上擺脫下劃線和其他整潔的東西) – NullVoxPopuli

0
params[:controller] 
#=> "TemplateUserController" 
params[:controller][/.*[^Controller]/] 
#=> "TemplateUser" 

params[:controller] 
#=> "UsersController" 
params[:controller][/.*[^Controller]/].singularize 
#=> "User" 

是的 - 在現實世界中有很多的控制器不涉及

PS

模型

Istead的params[:controller]可以使用Rails.controller

+0

謝謝,Rails.controller是我正在尋找的是= D(我甚至不知道如何獲得控制器名稱(我目前正在儘可能多地抽取我的應用程序......越少代碼越好......)更多評論我認爲這是好的) – NullVoxPopuli

+0

問題,我接受的太早了。我得到這個錯誤:NoMethodError:未定義的方法'控制器'的Rails:模塊 這是一個rails 3的東西嗎?我在2.3.8 – NullVoxPopuli

+0

好吧,然後使用'params [:controller]'爲最老的Rails – fl00r

0

@Samcontroller_name.classify.constantize的解決方案適用於所有控制器,雖然很多像我一樣的人可能不得不查找文檔以認識到「控制器」不是名稱的一部分。

如果你的控制器要控制一個模型,你應該考慮使用inherited_resources。你得到很多好處,其中之一是方法resource_class

class TemplateUserController < InheritedResources::Base 
    resource_class # => TemplateUser 
end 
相關問題