Rails - ALIAS_METHOD_CHAIN с помощью метода 'attribute ='
-
21-09-2019 - |
Вопрос
Я хотел бы «добавить» какой -то код на методе модели с помощью модуля, когда он включен. Я думаю, что я должен использовать Alias_method_chain, но я не знаю, как его использовать, поскольку мой «псевдоним» - один из тех методов, заканчивающихся знаком '=':
class MyModel < ActiveRecord::Base
def foo=(value)
... do stuff with value
end
end
Так это то, на что выглядит мой модуль прямо сейчас:
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
Я получаю ошибку по определению функции. Как обойти это?
Решение
alias_method_chain
это простой двухстрочный метод:
def alias_method_chain( target, feature )
alias_method "#{target}_without_#{feature}", target
alias_method target, "#{target}_with_#{feature}"
end
Я думаю, что вы хотите просто сделать их alias_method
называет себя в этом случае:
alias_method :foo_without_bar=, :foo=
alias_method :foo=, :foo_with_bar=
И вы бы определили свой метод так:
def foo_with_bar=(value)
...
end
Ruby Symbols обрабатывают след =
а также ?
имен методов без проблем.
Не связан с StackOverflow