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