Why alias_method fails in Rails model

不问归期 提交于 2019-12-18 01:52:21

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/16727976/why-alias-method-fails-in-rails-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!