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

6voto

aldrien.h Points 1497

Avant Rails 5, vous devez inclure le module helper.

Dans les versions plus récentes, vous pouvez utiliser des aides dans votre contrôleur avec l'objet helpers (pluriel).

  class UsersController
    def index
      helpers.my_helper_method_name(even_pass_arg_here)
    end
  end

https://www.rubyguides.com/2020/01/rails-helpers/

4voto

Ravistm Points 905

Dans Rails 5+, vous pouvez simplement utiliser la fonction comme démontré 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"

2voto

user5783745 Points 1214

Dans les rails 6, ajoutez simplement ceci à votre contrôleur :

class UsersController < ApplicationController
  include UsersHelper

  # Your actions

end

Maintenant, le fichier user_helpers.rb sera disponible dans le contrôleur.

1 votes

Cela fonctionne aussi dans les mailers, contrairement à l'appel via helpers (voir stackoverflow.com/questions/4937208/access-helpers-from-mailer ).

1voto

sandre89 Points 1224

Une alternative absente des autres réponses est que vous pouvez faire l'inverse : définir votre méthode dans votre contrôleur, puis utiliser méthode d'aide pour qu'elle soit aussi disponible sur les vues comme, vous savez, une méthode d'aide.

Par exemple :

class ApplicationController < ActionController::Base

private

  def something_count
    # All other controllers that inherit from ApplicationController will be able to call `something_count`
  end
  # All views will be able to call `something_count` as well
  helper_method :something_count 

end

1 votes

Je ne sais pas comment ils ont pu manquer cette simple ligne que je cherchais aussi :D

1voto

nruth Points 711

Vous pouvez également utiliser extend dans une action unique (objet contrôleur), plutôt que include au niveau de la classe.

Les réponses déjà données sont bonnes, mais il existe un autre moyen, si vous vous inquiétez de la portée d'une seule action (et peut-être de la définition des @vars que vous utilisez dans la vue, ce qui peut faire que l'endroit où elles sont définies a de l'importance). Voici un exemple.

module ApplicationHelper
  def set_page_title(title)
    @page_title = title
  end

  def set_meta_description(title)
    @meta_description = title
  end
end

dans un contrôleur

  before_filter :set_page_defaults

  def set_page_defaults
    extend ApplicationHelper
    set_page_title "Default page title here"
    set_meta_description ""
  end

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