O. *_*Dey 96 ruby activerecord model 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
Run Code Online (Sandbox Code Playgroud)
不用说,这不起作用.当我尝试保存新帖子时出现以下错误.
undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>
Run Code Online (Sandbox Code Playgroud)
显然,SanitizeHelper创建了一个HTML :: WhiteListSanitizer的实例,但是当我将它混合到我的模型中时,它找不到HTML :: WhiteListSanitizer.为什么?我该怎么做才能解决这个问题?
小智 127
这为您提供了辅助方法,没有将每个ActionView :: Helpers方法加载到模型中的副作用:
ActionController::Base.helpers.sanitize(str)
Run Code Online (Sandbox Code Playgroud)
小智 124
只需按如下方式更改第一行:
include ActionView::Helpers
Run Code Online (Sandbox Code Playgroud)
这将使它工作.
更新:对于Rails 3使用:
ActionController::Base.helpers.sanitize(str)
Run Code Online (Sandbox Code Playgroud)
幸得lornc的答案
sko*_*ozz 33
这对我来说效果更好:
简单:
ApplicationController.helpers.my_helper_method
Run Code Online (Sandbox Code Playgroud)
预先:
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
Run Code Online (Sandbox Code Playgroud)
资料来源:http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model
Tar*_*rmo 23
要从您自己的控制器访问帮助程序,只需使用:
OrdersController.helpers.order_number(@order)
Run Code Online (Sandbox Code Playgroud)
我不会推荐任何这些方法.相反,将它放在自己的命名空间中.
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
Run Code Online (Sandbox Code Playgroud)
如果要my_helper_method在模型内部使用,可以编写:
ApplicationController.helpers.my_helper_method
Run Code Online (Sandbox Code Playgroud)