在模型中使用帮助器:如何包含辅助依赖项?

时间:2009-01-28 22:13:13

标签: ruby-on-rails ruby activerecord model

我正在编写一个处理来自文本区域的用户输入的模型。根据{{​​3}}的建议,我在使用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 个答案:

答案 0 :(得分:124)

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

ActionController::Base.helpers.sanitize(str)

答案 1 :(得分:120)

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

include ActionView::Helpers

这将使其有效。

更新:对于Rails 3,请使用:

ActionController::Base.helpers.sanitize(str)

信用转到lornc's answer

答案 2 :(得分:29)

这对我来说效果更好:

<强>简单:

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

答案 3 :(得分:22)

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

OrdersController.helpers.order_number(@order)

答案 4 :(得分:8)

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

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

答案 5 :(得分:7)

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

ApplicationController.helpers.my_helper_method