繁体   English   中英

HABTM属性的setter上的alias_method_chain不起作用

[英]alias_method_chain on an HABTM attribute's setter isn't working

所以我有一个用于帖子和主题的HABTM。 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

但是,这现在破坏了post.topics=()

我不会收到任何错误或任何提示,但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个。

感谢您的任何见解。

我也遇到了同样的问题(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

我最终仅使用关联回调:before_add

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM