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

时间:2011-02-02 01:31:29

标签: ruby-on-rails ruby-on-rails-3

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

6 个答案:

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