모델에서 헬퍼 사용 : 헬퍼 종속성을 어떻게 포함합니까?


100

텍스트 영역에서 사용자 입력을 처리하는 모델을 작성 중입니다. 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를 찾을 수 없습니다. 왜? 이 문제를 해결하려면 어떻게해야합니까?

답변:


133

다음과 같이 첫 번째 줄을 변경하십시오.

include ActionView::Helpers

그것은 작동하게 할 것입니다.

업데이트 : Rails 3의 경우 :

ActionController::Base.helpers.sanitize(str)

신용은 lornc의 답변으로 이동


나 자신이 더 나아 졌다고 말할 수 없었습니다
Tilendor

1
감사. 포함을 클래스 정의 내부로 이동하여 작동하도록했습니다.
O. Frabjous-Dey

1
이것으로 나는 얻는다 stack level too deep. before_save 메소드에 있습니다.
Automatico '

42
뷰 레이어 문제를 활성 레코드 모델과 혼합하지 마십시오. 그것은 끔찍한 관행입니다. 훨씬 더 나은 접근 방식은 AR 앞에 독립형 입력 데이터 새니 타이 저 개체를 배치하고 여기에서 "깨끗한"속성을 검색하는 것입니다.
solnic jul.

1
이것은 매우 나쁜 해결책이며 불처럼 피해야합니다. Rails는 MVC (Model View Controller) 프레임 워크를 기반으로하며 헬퍼가 View 파트에 포함되므로 뷰 헬퍼 메서드를 모델과 혼합해서는 안됩니다.
jedi

132

이렇게하면 모든 ActionView :: Helpers 메서드를 모델에로드하는 부작용없이 도우미 메서드 만 제공됩니다.

ActionController::Base.helpers.sanitize(str)

6
저와 같은 느린 사람들을 위해-아무것도 포함 할 필요가 없습니다. ActionController :: Base.helpers.sanitize ( "On the string you want to sanitize")
Edward

감사합니다. Rails 2.3.14에서 작업했지만 수락 된 답변은 그렇지 않았습니다.
ChrisInEdmonton

application_helper에 메소드를 추가했지만 Rails 3.0.3을 사용하여 ActionController :: Base.helpers.my_method (options)를 사용하여 모델에서 액세스 할 수 없었습니까?
Tom Rossi

35

이것은 나를 위해 더 잘 작동합니다.

단순한:

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


1
ApplicationController.master_helper_module레일 3 나타나는 4에서 더 이상 존재하지 않습니다. 는 ApplicationController.helpers비록 좋은 일이다.
사무엘

내 요구에 적합했기 때문에이 (간단한 옵션)에 투표했습니다. ApplicationController의 before 필터에 의해 저장된 정보를 사용하는 하나의 도우미 만 필요하므로 제 경우에는 연결을 명시 적으로 만드는 것이 결합이 있음을 상기시키는 것입니다. [-이 URL은 웹 요청의 도메인에 따라 변경 사용 사례는 멀티 도메인 응용 프로그램은 응용 프로그램의 URL 링크 다시와 모델 통지를 통해 문제의 이메일이 있다는 것입니다]
iheggie

24

자신의 컨트롤러에서 도우미에 액세스하려면 다음을 사용하십시오.

OrdersController.helpers.order_number(@order)

2
그냥 사용 ApplicationController.helpers.order_number(@order). 즉, order_number위치에있었습니다Order Helper
ksugiarto

3
@rowanu 그는 "자신의 컨트롤러에서 헬퍼에 액세스하기 위해"가 아니라 "(자신의 컨트롤러에서 헬퍼에 액세스하기 위해)"라고 말합니다.
Ajedi32

11

이 방법 중 어느 것도 권장하지 않습니다. 대신 자체 네임 스페이스에 넣으십시오.

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

11

my_helper_method모델 내부 를 사용하려면 다음과 같이 작성할 수 있습니다.

ApplicationController.helpers.my_helper_method
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.