假设控制器名称为TemplateUserController
,其模型类为TemplateUser
。
现在,我可以做self.name.tableize.singularize.string_manipulation…
但这似乎有点过分...我想知道是否有更快的方法从控制器获取模型名称。谢谢! = d
答案 0 :(得分:5)
更直接的方法:controller_name.classify
。
答案 1 :(得分:2)
您可能知道无法保证控制器和型号之间的一对一映射。
然而,在你可以的情况下,CanCan
是一个需要做同样事情的宝石,它就是这样的:
def model_name
params[:controller].sub("Controller", "").underscore.split('/').last.singularize
end
因为模型和控制器之间没有隐含的链接(按惯例除外),所以根据控制器名称做出自己的判断是唯一的方法。
答案 2 :(得分:0)
params[:controller]
#=> "TemplateUserController"
params[:controller][/.*[^Controller]/]
#=> "TemplateUser"
params[:controller]
#=> "UsersController"
params[:controller][/.*[^Controller]/].singularize
#=> "User"
是的 - 在现实世界中,有许多控制器没有引用模型
PS
您可以使用params[:controller]
Rails.controller
答案 3 :(得分:0)
@Sam
controller_name.classify.constantize
的解决方案适用于所有控制器,尽管像我这样的许多人可能需要查找文档才能意识到“控制器”不是名称的一部分。
如果您的控制器要控制模型,您应该考虑使用inherited_resources。您可以获得许多好处,其中之一是方法resource_class
:
class TemplateUserController < InheritedResources::Base
resource_class # => TemplateUser
end