Rails:如何根据控制器类名获取模型类名?

class HouseBuyersController < ...
  def my_method
    # How could I get here the relevant model name, i.e. "HouseBuyer" ?
  end
end
Misha Moroshko asked 2019-08-13T05:26:06Z
6个解决方案
179 votes

这样做:

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
malclocke answered 2019-08-13T05:26:21Z
31 votes

如果您的控制器和模型位于同一名称空间中,那么您想要的是什么

controller_path.classify

controller_path为您提供名称空间; controller_name不是。

例如,如果您的控制器是

Admin::RolesController

然后:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT
Matt answered 2019-08-13T05:27:02Z
6 votes

这有点像黑客,但如果您的模型以您的控制器名称命名,那么:

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

......会给你&#34; HouseBuyer&#34; 在您的@model_name实例变量中。

再次,这是一个巨大的假设,&#34; HouseBuyersController&#34; 只处理&#34; HouseBuyer&#34; 楷模。

Scott answered 2019-08-13T05:27:41Z
4 votes

对于名称空间工作:

def resource_class
 controller_path.classify.constantize
end
hachpai answered 2019-08-13T05:28:06Z
0 votes

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

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

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

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

thenengah answered 2019-08-13T05:28:46Z
0 votes

由于我的控制器和模型是命名空间,因此接受的解决方案对我不起作用。 相反,我想出了以下方法:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
stoffus answered 2019-08-13T05:29:12Z
translate from https://stackoverflow.com:/questions/4869917/rails-how-to-get-the-model-class-name-based-on-the-controller-class-name