2009-01-28 7 views
78

Estoy escribiendo un modelo que maneja la entrada del usuario desde un área de texto. Siguiendo los consejos del http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input, estoy limpiando la entrada en el modelo antes de guardar en la base de datos, utilizando la devolución de llamada before_validate.Uso de ayudantes en el modelo: ¿cómo incluyo las dependencias de ayudante?

Las partes pertinentes de mi modelo de aspecto:

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 

Huelga decir que esto no funciona. Recibo el siguiente error cuando intento guardar una publicación nueva.

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

Al parecer, SanitizeHelper crea una instancia de HTML :: WhiteListSanitizer, pero cuando lo mezclo en mi modelo no puede encontrar HTML :: WhiteListSanitizer. ¿Por qué? ¿Qué puedo hacer al respecto para solucionarlo?

Respuesta

109

Sólo cambia la primera línea de la siguiente manera:

include ActionView::Helpers 

que hará que funciona.

ACTUALIZACIÓN: para los carriles 3 uso:

ActionController::Base.helpers.sanitize(str) 

crédito va a lornc's answer

+0

no podría haber dicho mejor – Tilendor

+1

Gracias. Lo tengo que trabajar moviendo el include al interior de la definición de la clase. –

+1

Con esto obtengo 'stack level too deep'. Está en un método before_save. – Automatico

121

Esto le da sólo el método de ayuda sin los efectos secundarios de la carga de cada ActionView :: Ayudantes método en su modelo :

ActionController::Base.helpers.sanitize(str) 
+4

Esto funcionó en Rails 3, mientras que la solución aceptada no. –

+6

Para las personas lentas como yo, no es necesario que incluya nada, solo use ActionController :: Base.helpers.sanitize ("En la cadena que desea desinfectar") – Edward

+0

Gracias, trabajó en Rails 2.3.14 mientras la respuesta aceptada no. – ChrisInEdmonton

22

Para acceder a los ayudantes desde sus propios controladores, simplemente use:

OrdersController.helpers.order_number(@order) 
+3

La pregunta es sobre Modelos, no Controladores – rowanu

+4

Lo mismo se aplica a los modelos también. – Tarmo

+2

Simplemente usando 'ApplicationController.helpers.order_number (@order)'. Eso significa que 'order_number' fue localizado en' Order Helper' – ksugiarto

9

No recomendaría ninguno de estos métodos. En cambio, colóquelo dentro de su propio espacio de nombres.

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 
22

Esto funciona mejor para mí:

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 

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

+0

El 'ApplicationController.master_helper_module' ya no existe en Rails 3 y 4. El 'ApplicationController.helpers' es muy bueno. – Samuel

+0

He votado a favor de esto (la opción simple) porque satisface mis necesidades: solo necesito un ayudante que esté utilizando información guardada por un filtro anterior en ApplicationController, por lo que en mi caso, hacer que la asociación sea explícita es un recordatorio de que existe un acoplamiento. [El caso de uso es una aplicación multidominio que emite correos electrónicos a través de un notificador modelo con un enlace de URL a la aplicación - esta URL cambia según el dominio de la solicitud web] – iheggie

+0

¡Gracias chicos! ;RE – skozz

2

Si desea utilizar un my_helper_method helper_method dentro de un modelo, se puede escribir:

ApplicationController.helpers.my_helper_method 
Cuestiones relacionadas