125 votes

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

Je suis en train d'écrire un modèle qui gère la saisie de l'utilisateur à partir d'une zone de texte. En suivant les conseils de http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-inputje suis le nettoyage de l'entrée dans le modèle, avant l'enregistrement dans la base de données, à l'aide de la before_validate de rappel.

Les parties pertinentes de mon modèle ressembler à 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 d'enregistrer un nouveau Post.

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

Apparemment, SanitizeHelper crée une instance de HTML::WhiteListSanitizer, mais quand je le mélange à mon modèle, il ne peut pas trouver de HTML::WhiteListSanitizer. Pourquoi? Que puis-je faire pour le réparer?

151voto

Alfreddd Points 730

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

   include ActionView::Helpers
 

cela fera que ça marche.

UPDATE: Pour l'utilisation de Rails 3

 ActionController::Base.helpers.sanitize(str)
 

les crédits vont à la réponse de lornc

141voto

lornc Points 641

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)
 

43voto

skozz Points 393

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

26voto

Tarmo Points 5457

Pour accéder aux aides de vos propres contrôleurs, utilisez simplement:

 OrdersController.helpers.order_number(@order)
 

13voto

axsuul Points 3060

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
 

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