Rails: как получить имя класса модели на основе имени класса контроллера?

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

Ответ 1

Это будет сделано:

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

Ответ 2

Если ваш контроллер и модель находятся в одном и том же пространстве имен, то вы хотите

controller_path.classify

controller_path предоставляет пространство имен; controller_name не работает.

Например, если ваш контроллер

Admin::RolesController

то

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

Ответ 3

Это немного взломать, но если ваша модель названа в честь имени вашего контроллера, то:

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

... даст вам "HouseBuyer" в вашей переменной экземпляра @model_name.

Опять же, это делает огромное предположение, что "HouseBuyersController" имеет дело только с моделями "HouseBuyer".

Ответ 4

Для рабочих пространств имен:

def resource_class
 controller_path.classify.constantize
end

Ответ 5

Это невозможно, если вы используете MVC по умолчанию, который, по-видимому, не соответствует вашему коду. Ваш контроллер, похоже, является моделью, но, возможно, у вас есть такой тип. Во всяком случае, контроллеры и модели принципиально разделены в Rails MVC, поэтому контроллеры не могут знать, с какой моделью они связаны.

Например, у вас может быть модель с именем post. Это может иметь контроллер posts_controller или иметь контроллер, например, article_controller. Rails знает только о моделях, когда вы определяете фактический код в контроллере, например

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

В стандартных контроллерах rails нет способа узнать, что такое модель.

Ответ 6

Принятое решение не сработало для меня, так как мой контроллер и модель были помещены в имена. Вместо этого я придумал следующий метод:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end