2010-12-07 4 views
0

이 코드는 제대로 동작합니다.확장 클래스 메서드

class ArInvHeader < ActiveRecord 

    HUMANIZED_ATTRIBUTES = { 
    :shipto_customer_address => _("Ship to customer address ") 
    } 

    def self.human_attribute_name(attr,options={}) 
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super 
    end 

end 

이 방법을 공용 파일에 넣어 모든 모델에서 사용하고 싶습니다.

def self.human_attribute_name(attr,options={}) 
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super 
end 

어떻게하면됩니까?

답변

2

시스템을 통해 사용할 수 있습니다 - 그 경우 해당 메소드로 ActiveRecord::Base을 확장하면 모든 하위 클래스에서 사용할 수 있습니다. 즉, 클래스를 열고 메소드를 정의하기 만하면됩니다.

class ActiveRecord::Base 

    def self.human_attribute_name(attr,options={}) 
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super 
    end 

end 

config/initializers/active_record.rb에 올려두면 애플리케이션에서 자동으로 필요합니다.

다른 방법으로는 유사한 결과를 달성하기 위해 레일에 존재하는 국제화 도구를 사용할 수 있습니다 - 로케일을 가정하는 것은 en입니다 :

# config/locales/en.yml 
en: 
    activerecord: 
    attributes: 
     ar_inv_header: 
     shipto_customer_address: "Ship to customer address " 

그런 식으로, 당신은 단지 ArInvHeader.human_attribute_name(:shipto_customer_address)를 호출 할 수 있습니다. 이것은 ActiveRecord 모델과 속성의 "사람 이름"을 변경하는 기본 방법입니다.

+0

예 똑같은 일을했으며 잘 작동합니다. 그러나 그것을하는 것이 선호되는 방법입니까? –

+0

번역은 이것으로 작동합니까? –

+0

나는 그것이 가장 깨끗한 방법이라고 생각한다 - 그리고 대부분의 사람들이 그것을 어떻게하는지, 정말로. Rails 모델의 기본 기능을 어떤 식 으로든 확장 한 일부 보석 (acts_as_ * 등)을 살펴 본다면 동일한 패턴이 적용된 것을 볼 수 있습니다. 읽기 : http://yehudakatz.com/2009/11/12/better-ruby-idioms/ – jgradim

0

이 기능을 사용하기 위해 locale.yml을 사용해 보셨습니까?

+0

무엇을 수정해야합니까? –

0

당신은 당신의 application_controller에 넣어이 줄을 사용할 수 있습니다

helper_method :human_attribute_name 

지금 당신은 내가 당신이 ActiveRecord::Base의 모든 서브 클래스 human_attribute_name을 사용하려면 같은데요