96 votes

Rails : Comment obtenir le nom de la classe du modèle à partir du nom de la classe du contrôleur ?

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

186voto

malclocke Points 2315

Cela va le faire :

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

Cela est souvent nécessaire pour abstraire les 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

37voto

Matt Points 9560

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

controller_path.classify

controller_path vous donne l'espace de nom ; controller_name ne le fait pas.

Par exemple, si votre contrôleur est

Admin::RolesController

alors :

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

6voto

Scott Lowe Points 9412

C'est un peu une pirouette, mais si votre modèle porte 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.

Là encore, cela suppose que "HouseBuyersController" ne traite que les modèles "HouseBuyer".

0voto

Dark Passenger Points 18408

Ce n'est pas possible si vous utilisez le MVC par défaut, que votre code ne semble pas suivre. Votre contrôleur semble être un modèle, mais peut-être avez-vous simplement obtenu un type à cet endroit. Quoi qu'il en soit, les contrôleurs et les modèles sont fondamentalement séparés dans Rails MVC, de sorte que les contrôleurs ne peuvent pas savoir à quel modèle ils sont associés.

Par exemple, vous pouvez avoir un modèle nommé post. Il peut avoir un contrôleur posts_controller ou 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, comme par exemple

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

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

0voto

stoffus Points 1

La solution acceptée n'a pas fonctionné pour moi car mon contrôleur et mon modèle étaient namespaced. À la place, j'ai trouvé la méthode suivante :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X