我正在处理我的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
当它被包含在内时,我想通过模块在模型的方法上"添加"一些代码.我想我应该使用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)
我在函数定义上出错了.怎么绕过这个?
我试图在我的模型中的一个属性中动态创建方法链.到现在为止我有这个功能:
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有些如何),程序进入堆栈循环.
我试图重命名该属性,所以我可以使用它的名称作为方法...
有人可以请教我这个.