web-dev-qa-db-ja.com

モデルでヘルパーを使用する:ヘルパーの依存関係を含めるにはどうすればよいですか?

テキスト領域からのユーザー入力を処理するモデルを書いています。 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が見つかりません。どうして?これを修正するにはどうすればよいですか?

95
O. Frabjous-Dey

最初の行を次のように変更します。

include ActionView::Helpers

それはそれが動作するようになります。

UPDATE:Rails 3を使用:

ActionController::Base.helpers.sanitize(str)

クレジットは lornc's answer

121
Alfreddd

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

ActionController::Base.helpers.sanitize(str)
126
lornc

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

シンプル:

ApplicationController.helpers.my_helper_method

Advance:

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

30
skozz

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

OrdersController.helpers.order_number(@order)
23
Tarmo

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

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
9
axsuul

モデル内でmy_helper_methodを使用する場合、次のように記述できます。

ApplicationController.helpers.my_helper_method