web-dev-qa-db-fra.com

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 lorsque je construis un objet JSON à retourner.

Ça va 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 assistant html_format?

184
AnApprentice

Note: Ceci a été écrit et accepté dans les Rails 2 jours; De nos jours, la réponse de Grosser (ci-dessous) est la voie à suivre.

Option 1: Le moyen le plus simple consiste probablement à inclure votre module d'assistance 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 en tant que fonction de classe et l'utiliser comme suit:

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

191
Xavier Holt

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 assistant dans une classe singleton puis singleton.helper
  • inclure l'assistant dans le contrôleur (ATTENTION: toutes les méthodes d'assistance seront transformées en actions du contrôleur)
265
grosser

Dans Rails 5, utilisez le 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. J'ai senti que sa réponse méritait sa propre réponse puisqu'il s'agit de la solution la plus propre et la plus facile.

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

73
Gerry Shaw

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

class ApplicationController < ActionController::Base
  include ApplicationHelper

...
10
Thadeu Esteves Jr.

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

9
Franco

Dans Rails 5+, vous pouvez simplement utiliser la fonction comme illustré ci-dessous avec un exemple simple:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

SORTIE

"2018-12-10 01:01 AM"
0
Ravistm
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

Dans Rails 5+, utilisez simplement helpers ( helpers.number_to_currency (10000) )

0
albertm