在模型中使用助手:我如何包含助手依赖?
我正在写一个模型来处理来自文本区域的用户input。 遵循http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input的build议,在保存到数据库之前,我正在清理模型中的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(biu)) end end
不用说,这是行不通的。 当我尝试保存新post时,出现以下错误。
undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>
显然,SanitizeHelper创build了一个HTML :: WhiteListSanitizer的实例,但是当我将它混合到我的模型中时,它找不到HTML :: WhiteListSanitizer。 为什么? 我能做些什么来解决这个问题?
只要改变第一行如下:
include ActionView::Helpers
这将使其工作。
更新:对于Rails 3使用:
ActionController::Base.helpers.sanitize(str)
信贷去lornc的答案
这给你一个帮助器方法,没有加载每个ActionView :: Helpers方法到你的模型的副作用:
ActionController::Base.helpers.sanitize(str)
要从您自己的控制器访问助手,只需使用:
OrdersController.helpers.order_number(@order)
这对我更好:
简单:
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
我不会推荐任何这些方法。 相反,把它放在自己的命名空间。
class Post < ActiveRecord::Base def clean_input self.input = Helpers.sanitize(self.input, :tags => %w(biu)) end module Helpers extend ActionView::Helpers::SanitizeHelper end end
如果你想在模型中使用helper_method my_helper_method,你可以写:
ApplicationController.helpers.my_helper_method