Использование помощников в модели: как включить вспомогательные зависимости? - PullRequest
91 голосов
/ 29 января 2009

Я пишу модель, которая обрабатывает ввод пользователя из текстовой области. Следуя совету http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input,, я очищаю ввод в модели перед сохранением в базу данных, используя обратный вызов before_validate.

Соответствующие части моей модели выглядят так:

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

Излишне говорить, что это не работает. При попытке сохранить новое сообщение появляется следующая ошибка.

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

Очевидно, SanitizeHelper создает экземпляр HTML :: WhiteListSanitizer, но когда я смешиваю его с моей моделью, он не может найти HTML :: WhiteListSanitizer. Зачем? Что я могу сделать, чтобы это исправить?

Ответы [ 6 ]

124 голосов
/ 29 сентября 2011

Это дает вам только вспомогательный метод без побочных эффектов загрузки каждого метода ActionView :: Helpers в вашу модель:

ActionController::Base.helpers.sanitize(str)
120 голосов
/ 29 января 2009

Просто измените первую строку следующим образом:

include ActionView::Helpers

это заставит это работать.

ОБНОВЛЕНИЕ: Для Rails 3 используйте:

ActionController::Base.helpers.sanitize(str)

Кредит идет на ответ Лорна

29 голосов
/ 16 июля 2014

Это работает лучше для меня:

Simple:

ApplicationController.helpers.my_helper_method

Advance:

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

Источник: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model

22 голосов
/ 04 февраля 2013

Чтобы получить доступ к помощникам с ваших собственных контроллеров, просто используйте:

OrdersController.helpers.order_number(@order)
9 голосов
/ 03 октября 2013

Я бы не рекомендовал ни один из этих методов. Вместо этого поместите его в собственное пространство имен.

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
7 голосов
/ 12 августа 2016

Если вы хотите использовать my_helper_method внутри модели, вы можете написать:

ApplicationController.helpers.my_helper_method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...