ruby on rails - 在模型中使用帮助程序:如何包含帮助程序依赖项?

我正在编写一个处理来自文本区域的用户输入的模型。 按照[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 votes

这为您提供了辅助方法,没有将每个ActionView :: Helpers方法加载到模型中的副作用:

ActionController::Base.helpers.sanitize(str)
lornc answered 2019-08-13T17:18:19Z
120 votes

只需按如下方式更改第一行:

include ActionView::Helpers

这将使它工作。

更新:对于Rails 3使用:

ActionController::Base.helpers.sanitize(str)

归功于洛恩克的答案

Alfreddd answered 2019-08-13T17:17:55Z
29 votes

这对我来说效果更好:

简单:

ApplicationController.helpers.my_helper_method

预先:

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]

skozz answered 2019-08-13T17:19:01Z
22 votes

要从您自己的控制器访问帮助程序,只需使用:

OrdersController.helpers.order_number(@order)
Tarmo answered 2019-08-13T17:19:25Z
8 votes

我不推荐任何这些方法。 相反,将它放在自己的命名空间中。

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
axsuul answered 2019-08-13T17:19:50Z
7 votes

如果要在模型中使用my_helper_method,可以编写:

ApplicationController.helpers.my_helper_method
Atchyut Nagabhairava answered 2019-08-13T17:20:15Z
translate from https://stackoverflow.com:/questions/489641/using-helpers-in-model-how-do-i-include-helper-dependencies