Ruby on Rails:如何从Controller内部获取Model名称?

时间:2011-07-13 16:28:28

标签: ruby-on-rails ruby

假设控制器名称为TemplateUserController,其模型类为TemplateUser

现在,我可以做self.name.tableize.singularize.string_manipulation… 但这似乎有点过分...我想知道是否有更快的方法从控制器获取模型名称。谢谢! = d

4 个答案:

答案 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