Rails: как получить имя класса модели на основе имени класса контроллера?



class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
542   6  

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".

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

def resource_class
 controller_path.classify.constantize
end

Это невозможно, если вы используете 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

    Ничего не найдено.