alias_attribute и создание и метод с исходным именем атрибута вызывает цикл - PullRequest
2 голосов
/ 27 мая 2010

Я пытаюсь динамически создать цепочку методов в одном атрибуте в моей модели. К настоящему времени у меня есть эта функция:

def create_filtered_attribute(attribute_name)
          alias_attribute "#{attribute_name}_without_filter", attribute_name

          define_method "#{attribute_name}" do
            filter_words(self.send("#{attribute_name}_without_filter"))
          end
end

, поэтому я получаю строку с именем атрибута, псевдонимом которого является ' _without_filter ' (здесь alias_method или alias_method_chain терпит неудачу, потому что атрибут не существует при создании класса), и я создаю новый метод с именем атрибута, где я фильтрую его содержимое.

Но почему-то, когда я вызываю "# {attribute_name} _without_filter" , он вызывает мой новый метод (я думаю, потому что alias_attribute немного как), и программа переходит в цикл стека.

Я пытаюсь переименовать этот атрибут, чтобы я мог использовать его имя для метода ...

Может кто-нибудь, пожалуйста, просветите меня об этом.

1 Ответ

6 голосов
/ 28 мая 2010

Существует разница между alias_method и alias_attribute. alias_method фактически создает копию старого метода, тогда как alias_attribute просто определяет новые методы, которые вызывают старые .

Обратите внимание, что методы model.attribute и model.attribute= в ActiveRecord просто вызывают read_attribute и write_attribute , поэтому вы всегда можете получить доступ к своему атрибуту, даже если вы переопределяете его метод получения или установки:

  define_method "#{attribute_name}" do
    filter_words(self.read_attribute(attribute_name))
  end
...