234 votes

Rails - Comment utiliser un Helper à l'intérieur d'un contrôleur

Bien que je sache que vous êtes censé utiliser une aide dans une vue, j'ai besoin d'une aide dans mon contrôleur car je construis un objet JSON à renvoyer.

C'est un peu comme ça :

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

Comment puis-je accéder à mon html_format aide ?

2 votes

Vous pouvez considérer la réponse de @grosser, elle est beaucoup plus complète.

0 votes

Je sais que c'est vieux, mais... qu'est-ce qui ne va pas avec les classes ruby ordinaires ? :p

341voto

grosser Points 4300

Vous pouvez utiliser

  • helpers.<helper> en Rails 5+. (ou ActionController::Base.helpers.<helper> )
  • view_context.<helper> ( Rails 4 & 3 ) (ATTENTION : ceci instancie une nouvelle instance de vue par appel)
  • @template.<helper> ( Rails 2 )
  • inclure l'aide dans une classe singleton et ensuite singleton.helper
  • include l'aide dans le contrôleur (ATTENTION : toutes les méthodes de l'aide deviendront des actions du contrôleur)

58 votes

Cette réponse est encore meilleure ! Dans les rails 3, il suffit d'appeler view_context.helper_function est simple et fonctionne très bien. ActionController::Base.helpers.helper_function est également bon.

4 votes

Merci de m'avoir fait découvrir view_context ! Juste ce qu'il faut ici, dommage que le vôtre ne soit pas la réponse acceptée !

1 votes

J'aime la réponse acceptée, si le module est limité aux éléments qui sont nécessaires dans ce contrôleur. Les fonctions incluses dans le contrôleur ne sont pas un problème tant que vos routes ne sont pas configurées pour correspondre à tout, c'est-à-dire, pas de routes "catch all". view_context ajoute de la typographie, si vous en avez beaucoup besoin. Cela dépend de la situation.

223voto

Xavier Holt Points 8629

Note : Ceci a été écrit et accepté à l'époque de Rails 2 ; aujourd'hui réponse de Grosser est la voie à suivre.

Option 1 : Le moyen le plus simple est probablement d'inclure votre module d'aide dans votre contrôleur :

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

Option 2 : Ou vous pouvez déclarer la méthode d'aide comme une fonction de classe, et l'utiliser comme suit :

MyHelper.html_format(comment.content)

Si vous souhaitez pouvoir l'utiliser à la fois comme une fonction d'instance et comme une fonction de classe, vous pouvez déclarer les deux versions dans votre aide :

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

J'espère que cela vous aidera !

0 votes

Merci, mais je suis un peu perdu. Actuellement, mon aide est dans /app/helpers/application_helper.rb ... Et vous suggérez que je devrais déplacer l'aide vers ApplicationController ?

0 votes

J'ai ajouté 'include ApplicationHelper' à mon application_controller mais le message d'erreur est 'NoMethodError (undefined method `html_format' for ApplicationHelper:Module):'.

1 votes

@AnApprentice On dirait que vous avez trouvé la solution, mais j'ai un peu modifié ma réponse, en espérant que cela rende les choses plus claires. Dans la première version, vous pouvez simplement utiliser html_format - vous avez seulement besoin MyHelper.html_format dans la seconde.

82voto

Gerry Points 2710

Dans Rails 5, utilisez l'option helpers.helper_function dans votre contrôleur.

Ejemplo:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

Source : D'après un commentaire de @Markus sur une autre réponse. J'ai pensé que sa réponse méritait sa propre réponse car c'est la solution la plus propre et la plus facile.

Référence : https://github.com/rails/rails/pull/24866

7 votes

C'est un peu bizarre qu'en console on appelle helper au singulier et dans le contrôleur c'est le pluriel.

10voto

Mon problème a été résolu avec l'option 1. Le moyen le plus simple est probablement d'inclure votre module d'aide dans votre contrôleur :

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1 votes

Seul bémol, il ajoute des actions de contrôleur avec le nom des fonctions d'aide. Mais en fait, je le fais aussi :)

9voto

Franco Points 108

En général, si l'aide doit être utilisée dans les contrôleurs (seulement), je préfère la déclarer comme une méthode d'instance de class ApplicationController .

6 votes

En tant que méthode protégée

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