alias_method_chain в установщике атрибута HABTM не работает - PullRequest
1 голос
/ 21 июня 2011

Итак, у меня есть HABTM для постов и тем.A Темы сообщения HABTM и тема Сообщения HABTM.Что мне нужно сделать, так это вызвать какой-то метод в сочетании с вызовом post.topics=()

Это то, что я пытался сделать в Post.rb:

def topics_with_extra_stuff=(topics)
  topics_without_extra_stuff=(topics)
  extra_stuff()
end
alias_method_chain :topics=, :extra_stuff

Однако, теперь это ломается1007 *

Я не получу сообщение об ошибке или что-то еще, но topics() все равно будет старым значением после изменения его на topics=()

Если я выдам ошибку в topics_with_extra_stuff=трассировка скажет, что в topics= произошла ошибка, так что я знаю, что она туда попала.Я также знаю, что extra_stuff() был вызван.

Вот пример вывода:

>> p = Post.last
=> #<Post id:1 ....>
>> p.topics
=> [#<Topic id:1 ....>, #<Topic id:2 ....>]
>> p.topics = [ p.topics.first ]
=> [#<Topic id:1 ....>]
>> p.topics
=> [#<Topic id:1 ....>, #<Topic id:2 ....>]

У него не должно быть 2 тем, только 1.

Спасибо за понимание.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

У меня была такая же проблема (Rails 2.3.11), но добавление обратного вызова before_add не было для меня вариантом, поэтому я продолжал искать.Наконец мне удалось заставить его работать, используя этот альтернативный способ наложения имен:

old_workflows_setter = self.instance_method(:workflows=)

define_method :workflows= do |value|
  # my code
  old_workflows_setter.bind(self).call(value)
end
1 голос
/ 22 июня 2011

Я просто использовал вместо этого обратный вызов ассоциации :before_add.

...