class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
答案 0 :(得分:180)
这样做:
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
答案 1 :(得分:31)
如果您的控制器和模型位于同一名称空间中,那么您想要的是
controller_path.classify
controller_path
为您提供命名空间; controller_name
没有。
例如,如果您的控制器是
Admin::RolesController
然后:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
答案 2 :(得分:6)
这有点像黑客,但如果您的模型以您的控制器名称命名,那么:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
...会在你的@model_name实例变量中给你“HouseBuyer”。
同样,这是一个巨大的假设,“HouseBuyersController”只处理“HouseBuyer”模型。
答案 3 :(得分:4)
对于名称空间工作:
def resource_class
controller_path.classify.constantize
end
答案 4 :(得分:0)
如果您使用的是默认MVC,那么这是不可能的,您的代码似乎没有遵循。你的控制器似乎是一个模型,但也许你只是在那里有一个类型。无论如何,控制器和模型在Rails MVC中基本上是分开的,因此控制器无法知道它们与哪个模型相关联。
例如,您可以拥有一个名为post的模型。这可以有一个控制器posts_controller或者可以有一个像articles_controller这样的控制器。当您在控制器中确定实际代码时,Rails只知道模型,例如
def index
@posts = Post.all
@posts = Article.all
end
在rails标准控制器中,无法知道模型是什么。
答案 5 :(得分:0)
我接受的解决方案对我不起作用,因为我的控制器和模型是命名空间。相反,我想出了以下方法:
def controllers_model
(self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end