web-dev-qa-db-fra.com

Rails: comment obtenir le nom de classe du modèle en fonction du nom de classe du contrôleur?

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

Cela le fera:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

Cela est souvent nécessaire lors de l'abstraction des actions du contrôleur:

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
184
malclocke

Si votre contrôleur et votre modèle sont dans le même espace de noms, alors ce que vous voulez, c'est

controller_path.classify

controller_path vous donne l'espace de noms; controller_name non.

Par exemple, si votre contrôleur est

Admin::RolesController

puis:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT
32
Matt

C'est un peu un hack, mais si votre modèle est nommé d'après le nom de votre contrôleur, alors:

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

... vous donnerait "HouseBuyer" dans votre variable d'instance @model_name.

Encore une fois, cela suppose que "HouseBuyersController" ne traite que les modèles "HouseBuyer".

6
Scott

Pour les espaces de noms qui fonctionnent:

def resource_class
 controller_path.classify.constantize
end
4
hachpai

Ce n'est pas possible si vous utilisez le MVC par défaut, que votre code ne semble pas suivre. Votre manette semble être un modèle, mais vous venez peut-être d'en avoir un type. Quoi qu'il en soit, les contrôleurs et les modèles sont fondamentalement séparés dans Rails MVC afin que les contrôleurs ne puissent pas savoir à quel modèle ils sont associés.

Par exemple, vous pourriez avoir un modèle nommé post. Cela peut avoir un contrôleur posts_controller ou peut avoir un contrôleur comme articles_controller. Rails ne connaît les modèles que lorsque vous définissez le code réel dans le contrôleur tel que

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

Dans Rails contrôleurs standard, il n'y a aucun moyen de savoir quel est le modèle.

0
thenengah

La solution acceptée n'a pas fonctionné pour moi car mon contrôleur et mon modèle étaient à espace de noms. Au lieu de cela, j'ai trouvé la méthode suivante:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
0
stoffus