Ich schreibe ein Modell, das Benutzereingaben aus einem Textbereich verarbeitet. Nach dem Rat von http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input bereinige ich die Eingabe im Modell zuvor Speichern in die Datenbank mit dem before_validate-Rückruf.
Die relevanten Teile meines Modells sehen folgendermaßen aus:
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
Das funktioniert natürlich nicht. Ich erhalte die folgende Fehlermeldung, wenn ich versuche, einen neuen Beitrag zu speichern.
undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>
Anscheinend erstellt SanitizeHelper eine Instanz von HTML :: WhiteListSanitizer, aber wenn ich es in mein Modell mische, kann es HTML :: WhiteListSanitizer nicht finden. Warum? Was kann ich dagegen tun, um das Problem zu beheben?
Ändern Sie einfach die erste Zeile wie folgt:
include ActionView::Helpers
das wird es klappen lassen.
UPDATE: Für Rails 3 verwenden Sie:
ActionController::Base.helpers.sanitize(str)
Gutschrift geht an lorncs Antwort
Dies gibt Ihnen nur die Hilfsmethode ohne die Nebenwirkungen des Ladens jeder ActionView :: Helpers-Methode in Ihr Modell:
ActionController::Base.helpers.sanitize(str)
Das funktioniert bei mir besser:
Einfach:
ApplicationController.helpers.my_helper_method
Vorschuss:
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
Quelle: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model
Um von Ihren eigenen Controllern auf Helfer zuzugreifen, verwenden Sie einfach:
OrdersController.helpers.order_number(@order)
Ich würde keine dieser Methoden empfehlen. Platzieren Sie es stattdessen in einem eigenen Namespace.
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
Wenn Sie ein my_helper_method
Innerhalb eines Modells können Sie schreiben:
ApplicationController.helpers.my_helper_method