扩展类方法

时间:2010-12-07 20:20:44

标签: ruby-on-rails ruby

此代码工作正常。

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

我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

我猜你希望human_attribute_name用于ActiveRecord::Base的所有子类 - 如果是这样的话,那只是用ActiveRecord::Base扩展{I}的问题,这样就可以了它的所有子类都可以使用:只需打开类,定义方法,然后就可以了:

class ActiveRecord::Base

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

end

只需将其放在config/initializers/active_record.rb上,应用程序就会自动要求它。

或者,您可以使用rails中的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模型和属性的“人名”的首选方法。

答案 1 :(得分:0)

您是否尝试过locale.yml来实现此功能?

答案 2 :(得分:0)

您可以将它放在application_controller上并使用以下行:

helper_method :human_attribute_name

现在您可以在整个系统中使用它