130 votes

Rails : appeler une autre action de contrôleur depuis un contrôleur

J'ai besoin d'appeler l'action de création dans le contrôleur A, à partir du contrôleur B.

La raison est que je dois rediriger différemment lorsque j'appelle depuis le contrôleur B.

Peut-on le faire en Rails ?

67voto

Spyros Points 13741

Vous pouvez utiliser une redirection vers cette action :

redirect_to your_controller_action_url

Plus sur : Guide Rails

Pour rendre la nouvelle action :

redirect_to your_controller_action_url and return

41voto

apneadiving Points 64660

La logique que vous présentez n'est pas MVC, donc pas Rails, compatible.

  • Un contrôleur rend une vue ou une redirection

  • Une méthode exécute du code

A partir de ces considérations, je vous conseille de créer des méthodes dans votre contrôleur et de les appeler depuis votre action.

Exemple :

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

Cela dit, vous pouvez faire exactement la même chose avec différents contrôleurs et invoquer une méthode du contrôleur A alors que vous êtes dans le contrôleur B.

Le vocabulaire est extrêmement important, c'est pourquoi j'insiste beaucoup.

30voto

austin Points 3677

Vous pouvez utiliser url_for pour obtenir l'URL d'un contrôleur et d'une action, puis utiliser redirect_to pour aller à cette URL.

redirect_to url_for(:controller => :controller_name, :action => :action_name)

13voto

fl00r Points 41855

C'est une mauvaise pratique que d'appeler une autre action du contrôleur.

Vous devez

  1. dupliquer cette action dans votre contrôleur B, ou
  2. l'envelopper comme une méthode de modèle, qui sera partagée par tous les contrôleurs, ou bien
  3. vous pouvez étendre cette action dans le contrôleur A.

Mon avis :

  1. La première approche n'est pas DRY mais c'est toujours mieux que de demander une autre action.
  2. La deuxième approche est bonne et flexible.
  3. La troisième approche est celle que je faisais souvent. Je vais donc vous montrer un petit exemple.

    def create
      @my_obj = MyModel.new(params[:my_model])
      if @my_obj.save
        redirect_to params[:redirect_to] || some_default_path
       end
    end

Donc vous pouvez envoyer à cette action redirect_to qui peut être le chemin de votre choix.

7voto

Michael Durrant Points 30342

Peut-être la logique pourrait-elle être extraite dans une aide ? Les aides sont disponibles pour toutes les classes et ne transfèrent pas le contrôle. Vous pourriez vérifier à l'intérieur, peut-être pour le nom du contrôleur, pour voir comment il a été appelé.

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