class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
Ответы:
Это сделает это:
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
controller_name.sub('_', ' ').titleize
получить «Покупателей жилья».
new.controller_name.classify.constantize
в определении класса.
Если ваш контроллер и модель находятся в одном пространстве имен, то вам нужно
controller_path.classify
controller_path
дает вам пространство имен; controller_name
нет.
Например, если ваш контроллер
Admin::RolesController
затем:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
Это немного похоже на взлом, но если ваша модель названа в честь имени вашего контроллера, тогда:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... даст вам "HouseBuyer" в вашей переменной экземпляра @model_name.
Опять же, здесь делается огромное предположение, что HouseBuyersController имеет дело только с моделями HouseBuyer.
Это невозможно, если вы используете MVC по умолчанию, которому ваш код не следует. Ваш контроллер кажется моделью, но, может быть, у вас только что есть тип. В любом случае контроллеры и модели в Rails MVC принципиально разделены, поэтому контроллеры не могут знать, с какой моделью они связаны.
Например, у вас может быть модель с именем post. Это может быть контроллер posts_controller или такой контроллер, как article_controller. Rails знает о моделях только тогда, когда вы определяете фактический код в контроллере, например
def index
@posts = Post.all
@posts = Article.all
end
В стандартных контроллерах rails нет возможности узнать, что это за модель.