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

bihw5rsg  于 2022-10-15  发布在  Ruby
关注(0)|答案(7)|浏览(144)

我正在编写一个处理来自文本区域的用户输入的模型。按照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>

显然,SanitiseHelper创建了一个HTML::WhiteListSaniizer的示例,但当我将其混合到我的模型中时,它找不到HTML::WhiteListSaniizer。为什么?我能做些什么来修复它呢?

kwvwclae

kwvwclae1#

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

include ActionView::Helpers

这将使其发挥作用。

**更新:**对于rails 3,请使用:

ActionController::Base.helpers.sanitize(str)

功劳归于lornc's answer

lawou6xi

lawou6xi2#

这为您提供了Helper方法,而不会产生将每个ActionView::Helpers方法加载到模型中的副作用:

ActionController::Base.helpers.sanitize(str)
neskvpey

neskvpey3#

这对我来说更有效:

简单:

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

kpbwa7wx

kpbwa7wx4#

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

OrdersController.helpers.order_number(@order)
jv4diomz

jv4diomz5#

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

ApplicationController.helpers.my_helper_method
7ivaypg9

7ivaypg96#

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

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
ncecgwcz

ncecgwcz7#

在Rails 7中:

full_sanitizer = Rails::Html::FullSanitizer.new
full_sanitizer.sanitize("<a href="javascript:alert('hacked!')">Some dangerous input</a>")

可用的消毒剂列表:https://github.com/rails/rails-html-sanitizer#sanitizers
然后,您的模型将是:

class Post < ActiveRecord::Base {
  before_validation :clean_input

  ...

  protected

  def clean_input
    full_sanitizer = Rails::Html::FullSanitizer.new
    self.input = full_sanitizer.sanitize(self.input, :tags => %w(b i u))
  end
end

相关问题