Uso de helpers en model: ¿cómo puedo incluir dependencias helper?


Estoy escribiendo un modelo que maneja la entrada del usuario desde un área de texto. Siguiendo los consejos de http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input , estoy limpiando la entrada en el modelo antes de guardarla en la base de datos, usando la devolución de llamada before_validate.

Las partes relevantes de mi modelo se ven así:

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

No hace falta decir que esto no funciona. Obtengo el siguiente error cuando intento guardar una nueva publicación.

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

Aparentemente, 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 arreglarlo?

Author: awendt, 2009-01-29

6 answers

Simplemente cambie la primera línea de la siguiente manera :

include ActionView::Helpers

Eso hará que funcione.

ACTUALIZACIÓN: Para Rails 3 use:

ActionController::Base.helpers.sanitize(str)

El crédito es para la respuesta de lornc

 113
Author: Alfreddd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:59

Esto le da solo el método helper sin los efectos secundarios de cargar cada método ActionView:: Helpers en su modelo:

ActionController::Base.helpers.sanitize(str)
 124
Author: lornc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-29 06:31:58

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

 28
Author: skozz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-16 15:57:32

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

OrdersController.helpers.order_number(@order)
 22
Author: Tarmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-04 08:09:48

No recomendaría ninguno de estos métodos. En su lugar, póngalo 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
 8
Author: axsuul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-03 09:04:17

Si quieres usar un my_helper_method dentro de un modelo, puedes escribir:

ApplicationController.helpers.my_helper_method
 3
Author: Atchyut Nagabhairava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-20 12:29:24