2010-12-17 2 views
6

내가 간단한 검증이 :이 코드에레일 : 내 모델에서 "number_with_delimiter"메서드가 인식되지 않는 이유는 무엇입니까?

class Product < ActiveRecord::Base 
    # include ActionView::Helpers::NumberHelper 
    ... 
    validates_numericality_of :price, :less_than => 1000000, 
          :message => "must be less than #{number_with_delimiter(1000000)}"      
    ... 
end 

을, 나는 다음과 같은 오류가 발생했습니다 :

undefined method `number_with_delimiter' for #<Class:0x2665a58> 

나는 추가하려고 :

include ActionView::Helpers::NumberHelper 

을하지만하지 않았다 도움.

무엇이 누락 되었습니까?

답변

10

진정한 문제는 클래스에이 모듈을 포함하는 것이 아니라 그것으로 클래스를 확장하고 있다는 점이다.

차이점은 포함에서 인스턴스에서 사용할 수있는 방법을 만들 것입니다. 확장은 클래스에서 사용하려고하는 위치로 확장됩니다.

+0

@ Ryan : 클래스 내부를 포함시키는 것이이 클래스에서 내 자신의 메서드를 정의하는 것과 동일하다는 것을 알고 있습니다. 이것은'self.number_with_delimiter (...)'를 사용할 수 있다는 것을 의미합니까? 클래스 외부에'include'를 넣으면'ActionView :: Helpers :: NumberHelper' 내부의 모든 메소드가 전역 변수가됩니까? –

+0

@Misha : 네, 그들은 글로벌하게 될 것입니다. 그러나 그것은 일반적으로 Not A Good (tm)입니다. 이 경우 가장 좋은 방법은 모듈을 사용하여 클래스를 '확장'하는 것입니다. –

+0

@ 라이언 : 어떤 클래스를 확장 하시겠습니까? –

2

NumberHelper 클래스가 응용 프로그램에 액세스 할 수 있습니까? 여기

확인 official Rails docs

+0

대단히 감사합니다! –

3

당신은 연장 사용해야합니다

사용법 : extend ActionView::Helpers::NumberHelper

그것은 나를

0

대신 ActionView 모듈을 확장하기위한 좋다. 당신은 예를 들어 ActiveSupport 대신

에서 방법을 사용할 수 있습니다

ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})

+1

은 메모리 사용 측면에서 성능 측면에서 더 좋습니다. – Ninjaxor

관련 문제