복붙노트

[RUBY-ON-RAILS] 모델에서 헬퍼를 사용 : 어떻게 도우미 종속 관계를 포함합니까?

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

말할 필요도없이,이 작동하지 않습니다. 내가하려고 할 때 다음과 같은 오류가 새로운 포스트 저장.

undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>

분명히, SanitizeHelper는 HTML :: WhiteListSanitizer의 인스턴스를 생성하지만 내 모델로 혼합 할 때 그것은 HTML을 찾을 수 없습니다 : WhiteListSanitizer을. 왜? 나는이 문제를 해결할 방법에 대해 무엇을 할 수 있습니까?

해결법

  1. ==============================

    1.다음과 같이 그냥 첫 번째 라인을 변경 :

    다음과 같이 그냥 첫 번째 라인을 변경 :

    include ActionView::Helpers
    

    그게 작동 할 것입니다.

    UPDATE : 레일 3 사용의 경우 :

    ActionController::Base.helpers.sanitize(str)
    

    신용 lornc의 대답에 간다

  2. ==============================

    2.이 모델에 모든 ActionView :: 도우미 방법을로드의 부작용없이 당신에게 단지 도우미 메서드를 제공합니다 :

    이 모델에 모든 ActionView :: 도우미 방법을로드의 부작용없이 당신에게 단지 도우미 메서드를 제공합니다 :

    ActionController::Base.helpers.sanitize(str)
    
  3. ==============================

    3.이것은 나를 위해 잘 작동 :

    이것은 나를 위해 잘 작동 :

    단순한:

    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

  4. ==============================

    4.자신의 컨트롤러에서 액세스 도우미에 바로 사용 :

    자신의 컨트롤러에서 액세스 도우미에 바로 사용 :

    OrdersController.helpers.order_number(@order)
    
  5. ==============================

    5.나는이 방법을 권하고 싶지 않다. 대신, 자신의 네임 스페이스에 넣어.

    나는이 방법을 권하고 싶지 않다. 대신, 자신의 네임 스페이스에 넣어.

    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
    
  6. ==============================

    6.당신이 모델 내부에 상기 my_helper_method를 사용하려는 경우, 당신은 쓸 수 있습니다 :

    당신이 모델 내부에 상기 my_helper_method를 사용하려는 경우, 당신은 쓸 수 있습니다 :

    ApplicationController.helpers.my_helper_method
    
  7. from https://stackoverflow.com/questions/489641/using-helpers-in-model-how-do-i-include-helper-dependencies by cc-by-sa and MIT license