Rails:如何获取基于控制器类名的模型类名?

class HouseBuyersController < ... def my_method # How could I get here the relevant model name, ie "HouseBuyer" ? end end 

这将做到这一点:

 class HouseBuyersController < ApplicationController def index @model_name = controller_name.classify end end 

抽象控制器操作时通常需要这样做:

 class HouseBuyersController < ApplicationController def index # Equivalent of @house_buyers = HouseBuyer.find(:all) objects = controller_name.classify.constantize.find(:all) instance_variable_set("@#{controller_name}", objects) end end 

如果你的控制器和模型在相同的命名空间,那么你想要的是

 controller_path.classify 

controller_path给你的名字空间; controller_name不。

例如,如果你的控制器是

 Admin::RolesController 

然后:

 controller_path.classify # "Admin::Role" # CORRECT controller_name.classify # "Role" # INCORRECT 

这有点破解,但是如果你的模型是以你的控制器名字命名的,那么:

 class HouseBuyersController < ApplicationController def my_method @model_name = self.class.name.sub("Controller", "").singularize end end 

…会在@model_name实例variables中给你“HouseBuyer”。

再一次,这就产生了一个巨大的假设:“HouseBuyersController”只处理“HouseBuyer”模型。

对于正在工作的命名空间:

 def resource_class controller_path.classify.constantize end 

这是不可能的,如果你使用默认的MVC,你的代码似乎没有遵循。 你的控制器似乎是一个模型,但也许你只是在那里得到一个types。 无论如何,控制器和模型在Rails MVC中基本上是分开的,所以控制器无法知道它们与哪个模型相关联。

例如,你可以有一个名为post的模型。 这可以有一个控制器posts_controller或可以有像articles_controller控制器。 当你在控制器中定义实际的代码时,Rails只知道模型

 def index @posts = Post.all @posts = Article.all end 

在rails标准控制器中,无法知道模型是什么。

我接受的解决scheme并不适合我,因为我的控制器和模型是命名空间的。 相反,我想出了以下方法:

 def controllers_model (self.class.name.split('::')[0..-2] << controller_name.classify).join('::') end