轨道上的红宝石 - HABTM 属性的设置器上的alias_method_chain不起作用



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

相关内容

  • 没有找到相关文章

最新更新