web-dev-qa-db-fra.com

Utilisation d’aides dans le modèle: comment inclure des dépendances d’aide?

J'écris un modèle qui gère les entrées utilisateur à partir d'une zone de texte. Suivant les conseils de http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input , je nettoie l'entrée dans le modèle avant enregistrement dans la base de données à l’aide du rappel before_validate.

Les parties pertinentes de mon modèle ressemblent à ceci:

include ActionView::Helpers::SanitizeHelper

class Post < ActiveRecord::Base {
  before_validation :clean_input

  ...

  protected

  def clean_input
    self.input = sanitize(self.input, :tags => %w(b i u))
  end
end

Inutile de dire que cela ne fonctionne pas. Je reçois le message d'erreur suivant lorsque j'essaie de sauvegarder un nouveau message.

undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>

Apparemment, SanitizeHelper crée une instance de HTML :: WhiteListSanitizer, mais lorsque je la mélange dans mon modèle, il ne trouve pas HTML :: WhiteListSanitizer. Pourquoi? Que puis-je faire à ce sujet pour le réparer?

95
O. Frabjous-Dey

Il suffit de changer la première ligne comme suit:

include ActionView::Helpers

cela fera que ça marche.

UPDATE: Pour Rails 3 utiliser:

ActionController::Base.helpers.sanitize(str)

Le crédit va à réponse de Lornc

121
Alfreddd

Cela vous donne juste la méthode d'assistance sans les effets secondaires du chargement de chaque méthode ActionView :: Helpers dans votre modèle:

ActionController::Base.helpers.sanitize(str)
126
lornc

Cela fonctionne mieux pour moi:

Simple:

ApplicationController.helpers.my_helper_method

Avance:

class HelperProxy < ActionView::Base
  include ApplicationController.master_helper_module

  def current_user
    #let helpers act like we're a guest
    nil
  end       

  def self.instance
    @instance ||= new
  end
end

Source: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model

30
skozz

Pour accéder aux assistants à partir de vos propres contrôleurs, utilisez simplement:

OrdersController.helpers.order_number(@order)
23
Tarmo

Je ne recommanderais aucune de ces méthodes. Au lieu de cela, placez-le dans son propre espace de noms.

class Post < ActiveRecord::Base
  def clean_input
    self.input = Helpers.sanitize(self.input, :tags => %w(b i u))
  end

  module Helpers
    extend ActionView::Helpers::SanitizeHelper
  end
end
9
axsuul

Si vous voulez utiliser le my_helper_method à l'intérieur d'un modèle, vous pouvez écrire:

ApplicationController.helpers.my_helper_method
8