Rails: Как получить имя класса модели на основе имени класса контроллера? - PullRequest
93 голосов
/ 02 февраля 2011
class HouseBuyersController < ...
  def my_method
    # How could I get here the relevant model name, i.e. "HouseBuyer" ?
  end
end

Ответы [ 6 ]

182 голосов
/ 21 июля 2011

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

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
32 голосов
/ 18 сентября 2014

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

controller_path.classify

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

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

Admin::RolesController

тогда:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT
6 голосов
/ 02 февраля 2011

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

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

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

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

4 голосов
/ 26 марта 2015

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

def resource_class
 controller_path.classify.constantize
end
0 голосов
/ 26 сентября 2013

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

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
0 голосов
/ 02 февраля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...