110

我正在编写一个模型来处理来自文本区域的用户输入。根据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。为什么?我能做些什么来解决这个问题?

4

6 回答 6

142

只需将第一行更改如下:

include ActionView::Helpers

这将使它工作。

更新:对于 Rails 3 使用:

ActionController::Base.helpers.sanitize(str)

归功于lornc的回答

于 2009-01-28T23:39:48.287 回答
137

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

ActionController::Base.helpers.sanitize(str)
于 2011-09-29T06:31:58.613 回答
39

这对我来说效果更好:

简单的:

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

于 2014-07-16T15:57:32.410 回答
25

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

OrdersController.helpers.order_number(@order)
于 2013-02-04T08:09:48.783 回答
15

如果要使用my_helper_method内部模型,可以编写:

ApplicationController.helpers.my_helper_method
于 2016-08-12T05:36:58.117 回答
12

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

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
于 2013-10-03T09:04:17.413 回答