2010-12-07 6 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

Я предполагаю, что вы хотите использовать human_attribute_name для всех подклассов ActiveRecord::Base - если это так, это просто вопрос расширения 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, и оно будет автоматически потребоваться приложением.

В качестве альтернативы, вы можете использовать инструменты i18n, присутствующие в рельсах для достижения аналогичного результата - если локаль является 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

Да, я сделал то же самое, и он отлично работает. Но предпочтительнее ли это сделать? – 2010-12-07 22:23:07

0

Вы попробовали locale.yml для этой функции?

+0

Что мне нужно изменить для этого? – 2010-12-07 20:27:58

0

Вы можете поместить его на свой application_controller и использовать эту строку:

helper_method :human_attribute_name 

Теперь вы можете использовать его по всей системе

Смежные вопросы