27
class Country < ActiveRecord::Base

  #alias_method :name, :langEN # here fails
  #alias_method :name=, :langEN=

  #attr_accessible :name

  def name; langEN end # here works
end

In first call alias_method fails with:

NameError: undefined method `langEN' for class `Country'

I mean it fails when I do for example Country.first.

But in console I can call Country.first.langEN successfully, and see that second call also works.

What am I missing?

mu is too short
  • 426,620
  • 70
  • 833
  • 800
sites
  • 21,417
  • 17
  • 87
  • 146

1 Answers1

60

ActiveRecord uses method_missing (AFAIK via ActiveModel::AttributeMethods#method_missing) to create attribute accessor and mutator methods the first time they're called. That means that there is no langEN method when you call alias_method and alias_method :name, :langEN fails with your "undefined method" error. Doing the aliasing explicitly:

def name
  langEN
end

works because the langEN method will be created (by method_missing) the first time you try to call it.

Rails offers alias_attribute:

alias_attribute(new_name, old_name)

Allows you to make aliases for attributes, which includes getter, setter, and query methods.

which you can use instead:

alias_attribute :name, :langEN

The built-in method_missing will know about aliases registered with alias_attribute and will set up the appropriate aliases as needed.

mu is too short
  • 426,620
  • 70
  • 833
  • 800