Rails – Comment utiliser un assistant dans un contrôleur

Bien que je sache que vous êtes censé utiliser un assistant dans une vue, j’ai besoin d’un assistant dans mon contrôleur pour créer un object JSON à retourner.

Ça va un peu comme ça:

def xxxxx @comments = Array.new @c_comments.each do |comment| @comments < comment.id, :content => html_format(comment.content) } end render :json => @comments end 

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

Note: Ceci a été écrit et accepté dans les Rails 2 jours; Aujourd’hui, la réponse du délinquant (ci-dessous) 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’assistance comme une fonction de classe et l’utiliser comme ceci:

 MyHelper.html_format(comment.content) 

Si vous voulez pouvoir l’utiliser à la fois comme fonction d’instance et comme fonction de classe, vous pouvez déclarer les deux versions dans votre assistant:

 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 t’aides!

Vous pouvez utiliser

  • @modèle. (rails 2)
  • view_context. (rails 3) (ATTENTION: ceci instancie une nouvelle instance de vue par appel)
  • ActionController :: Base.helpers
  • inclure l’aide dans une classe singleton, puis singleton.helper
  • inclure l’assistant dans le contrôleur (ATTENTION: toutes les méthodes d’assistance seront intégrées dans les actions du contrôleur)

Dans Rails 5, utilisez la fonction helpers.helper_function dans votre contrôleur.

Exemple:

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

Source: D’après un commentaire de @Markus sur une réponse différente. Je pensais 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

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

 class ApplicationController < ActionController::Base include ApplicationHelper ... 

En général, si le helper doit être utilisé dans (juste) des contrôleurs, je préfère le déclarer comme une méthode d’instance de la class ApplicationController .