6 ответов:
это сделает это:
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_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 или может иметь контроллер, как articles_controller. Рельсы только знает о модели, когда вы определяете фактический код в контроллере, такие как
def index @posts = Post.all @posts = Article.all endв стандартных контроллерах rails нет способа узнать, что такое модель.
принятое решение не работало для меня, так как мой контроллер и модель были помещены в пространство имен. Вместо этого я придумал следующий метод:
def controllers_model (self.class.name.split('::')[0..-2] << controller_name.classify).join('::') end
Comments