class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
Réponses
Trop de publicités?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
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
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".
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.