class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
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
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
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".
Pour les espaces de noms qui fonctionnent:
def resource_class
controller_path.classify.constantize
end
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.
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