テキスト領域からのユーザー入力を処理するモデルを書いています。 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が見つかりません。どうして?これを修正するにはどうすればよいですか?
最初の行を次のように変更します。
include ActionView::Helpers
それはそれが動作するようになります。
UPDATE:Rails 3を使用:
ActionController::Base.helpers.sanitize(str)
クレジットは lornc's answer
これにより、すべてのActionView :: Helpersメソッドをモデルにロードする副作用のないヘルパーメソッドのみが提供されます。
ActionController::Base.helpers.sanitize(str)
これは私にとってはうまくいきます:
シンプル:
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
独自のコントローラーからヘルパーにアクセスするには、次を使用します。
OrdersController.helpers.order_number(@order)
これらの方法はお勧めしません。代わりに、独自の名前空間内に配置してください。
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
モデル内でmy_helper_method
を使用する場合、次のように記述できます。
ApplicationController.helpers.my_helper_method