Rails - 带有'attribute ='方法的alias_method_chain

kik*_*ito 2 ruby-on-rails alias-method-chain

当它被包含在内时,我想通过模块在模型的方法上"添加"一些代码.我想我应该使用alias_method_chain,但我不知道如何使用它,因为我的'别名方法'是以'='符号结尾的方法之一:

class MyModel < ActiveRecord::Base

  def foo=(value)
    ... do stuff with value
  end

end
Run Code Online (Sandbox Code Playgroud)

所以这就是我的模块现在的样子:

module MyModule
  def self.included(base)
    base.send(:include, InstanceMethods)
    base.class_eval do

      alias_method_chain 'foo=', :bar

    end
  end

  module InstanceMethods
    def foo=_with_bar(value) # ERROR HERE
      ... do more stuff with value
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在函数定义上出错了.怎么绕过这个?

Jai*_*yer 8

alias_method_chain 是一个简单的两行方法:

def alias_method_chain( target, feature )
  alias_method "#{target}_without_#{feature}", target
  alias_method target, "#{target}_with_#{feature}"
end
Run Code Online (Sandbox Code Playgroud)

我想你想要的答案就是alias_method在这种情况下简单地自己做两个电话:

alias_method :foo_without_bar=, :foo=
alias_method :foo=, :foo_with_bar=
Run Code Online (Sandbox Code Playgroud)

你会像这样定义你的方法:

def foo_with_bar=(value)
  ...
end
Run Code Online (Sandbox Code Playgroud)

Ruby符号处理尾随=?方法名称没有问题.

  • alias_method_chain不是一个简单的两行方法(更多?),它应该按预期处理=符号(即创建foo_with_bar =和foo_without_bar =) (5认同)