web-dev-qa-db-ger.com

Verwenden von Hilfsprogrammen in model: Wie binde ich Hilfsprogrammabhängigkeiten ein?

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?

95
O. Frabjous-Dey

Ä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

121
Alfreddd

Dies gibt Ihnen nur die Hilfsmethode ohne die Nebenwirkungen des Ladens jeder ActionView :: Helpers-Methode in Ihr Modell:

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

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

30
skozz

Um von Ihren eigenen Controllern auf Helfer zuzugreifen, verwenden Sie einfach:

OrdersController.helpers.order_number(@order)
23
Tarmo

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
9
axsuul

Wenn Sie ein my_helper_method Innerhalb eines Modells können Sie schreiben:

ApplicationController.helpers.my_helper_method