标签: alias-method-chain

alias_method和alias_method_chain有什么区别?

我正在处理我的Web应用程序,我想覆盖一个方法,例如,如果原始类是

class A
  def foo
    'original'
  end
end
Run Code Online (Sandbox Code Playgroud)

我想覆盖foo方法,它可以这样做

class A
  alias_method :old_foo, :foo
  def foo
    old_foo + ' and another foo'
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以像这样调用新旧方法

obj = A.new
obj.foo  #=> 'original and another foo'
obj.old_foo #=> 'original'
Run Code Online (Sandbox Code Playgroud)

那么如果我可以像我一样访问并保留两种方法,那么alias_method_chain的用途是什么?

ruby ruby-on-rails alias-method-chain alias-method ruby-on-rails-3

7
推荐指数
1
解决办法
497
查看次数

Rails - 带有'attribute ='方法的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)

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

ruby-on-rails alias-method-chain

2
推荐指数
1
解决办法
1227
查看次数

alias_attribute以及使用原始属性名称创建和方法会导致循环

我试图在我的模型中的一个属性中动态创建方法链.到现在为止我有这个功能:

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
Run Code Online (Sandbox Code Playgroud)

所以我收到一个带有属性名称的字符串,别名为' _without_filter '(alias_method或alias_method_chain在这里失败,因为在创建类时属性不存在),我创建了一个带有属性名称的新方法,我在其中过滤了内容.

但不知何故,当我调用"#{attribute_name} _without_filter"时,它调用我的新方法(我认为因为alias_attribute有些如何),程序进入堆栈循环.

我试图重命名该属性,所以我可以使用它的名称作为方法...

有人可以请教我这个.

ruby-on-rails alias-method-chain alias-method

2
推荐指数
1
解决办法
3513
查看次数