class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
Rails: как получить имя класса модели на основе имени класса контроллера?
Ответ 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