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
У рейкових стандартних контролерах немає способу дізнатися, що це за модель.