110

テキスト領域からのユーザー入力を処理するモデルを作成しています。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>

どうやら、SanitizeHelper は HTML::WhiteListSanitizer のインスタンスを作成しますが、それをモデルに混ぜると、HTML::WhiteListSanitizer が見つかりません。なんで?これを修正するにはどうすればよいですか?

4

6 に答える 6

142

次のように最初の行を変更するだけです。

include ActionView::Helpers

それはそれを機能させるでしょう。

更新: Rails 3 の場合:

ActionController::Base.helpers.sanitize(str)

クレジットはlorncの答えに行きます

于 2009-01-28T23:39:48.287 に答える
137

これにより、すべての ActionView::Helpers メソッドをモデルにロードするという副作用のないヘルパー メソッドのみが得られます。

ActionController::Base.helpers.sanitize(str)
于 2011-09-29T06:31:58.613 に答える
39

これは私にとってはうまくいきます:

単純:

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

于 2014-07-16T15:57:32.410 に答える
25

自分のコントローラーからヘルパーにアクセスするには、次を使用します。

OrdersController.helpers.order_number(@order)
于 2013-02-04T08:09:48.783 に答える
15

モデルの内部で使用したい場合は、次のmy_helper_methodように記述できます。

ApplicationController.helpers.my_helper_method
于 2016-08-12T05:36:58.117 に答える
12

これらの方法のいずれもお勧めしません。代わりに、独自の名前空間内に配置してください。

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
于 2013-10-03T09:04:17.413 に答える