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