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?
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
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)
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
Pour accéder aux assistants à partir de vos propres contrôleurs, utilisez simplement:
OrdersController.helpers.order_number(@order)
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
Si vous voulez utiliser le my_helper_method
à l'intérieur d'un modèle, vous pouvez écrire:
ApplicationController.helpers.my_helper_method