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

Mis*_*hko 94 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
Run Code Online (Sandbox Code Playgroud)

mal*_*cke 184

这样做:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 36

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

controller_path.classify
Run Code Online (Sandbox Code Playgroud)

controller_path给你命名空间; controller_name没有.

例如,如果您的控制器是

Admin::RolesController
Run Code Online (Sandbox Code Playgroud)

然后:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是比接受的更"正确"的答案 (4认同)

Sco*_*ott 6

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

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

...会在你的@model_name实例变量中给你"HouseBuyer".

再次,这是一个巨大的假设,"HouseBuyersController"只处理"HouseBuyer"模型.