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

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)

  • 对于像我这样的慢人 - 你不需要包含任何东西,只需使用ActionController :: Base.helpers.sanitize("在你想要消毒的字符串上") (6认同)
  • 这在Rails 3中有效,而公认的解决方案却没有. (4认同)

小智 124

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

include ActionView::Helpers
Run Code Online (Sandbox Code Playgroud)

这将使它工作.

更新:对于Rails 3使用:

ActionController::Base.helpers.sanitize(str)
Run Code Online (Sandbox Code Playgroud)

幸得lornc的答案

  • 请不要将视图层问题与活动记录模型混合使用.那是一种可怕的做法.更好的方法是在AR前面放置一个独立的输入数据清理程序对象,并从中检索"干净"属性. (40认同)

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)

  • @rowanu他说"要访问(来自你自己的控制器的助手)",而不是"(从你自己的控制器访问助手)". (3认同)
  • 只需使用`ApplicationController.helpers.order_number(@order)`.这意味着`order_number`位于`Order Helper`上 (2认同)

axs*_*uul 9

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

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)


Atc*_*ava 8

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

ApplicationController.helpers.my_helper_method
Run Code Online (Sandbox Code Playgroud)