情况如下:
我有一个用户模型和两个用于身份验证的模块:Oauth 和 Openid。它们都覆盖ActiveRecord#save
,并且有相当多的实现逻辑。
鉴于我可以判断用户何时尝试通过 Oauth 与 Openid 登录,但它们都已被覆盖save
,那么“最终”如何覆盖save
以便我可以有条件地调用其中一个模块的实现?
这是我所描述的基本结构:
module UsesOauth
def self.included(base)
base.class_eval do
def save
puts "Saving with Oauth!"
end
def save_with_oauth
save
end
end
end
end
module UsesOpenid
def self.included(base)
base.class_eval do
def save
puts "Saving with OpenID!"
end
def save_with_openid
save
end
end
end
end
module Sequencer
def save
if using_oauth?
save_with_oauth
elsif using_openid?
save_with_openid
else
super
end
end
end
class User < ActiveRecord::Base
include UsesOauth
include UsesOpenid
include Sequencer
end
我正在考虑使用alias_method
like so,但这太复杂了,因为我可能还有 1 或 2 个类似的模块。我也尝试使用这些save_with_oauth
方法(如上所示),几乎可以工作。唯一缺少的是我还需要调用ActiveRecord::Base#save
(超级方法),所以是这样的:
def save_with_oauth
# do this and that
super.save
# the rest
end
但我不允许在 ruby 中这样做。
有什么聪明的解决方案的想法吗?
那alias_method_chain
会做吗?我避免这样做,因为人们似乎说这是一个坏主意。
(边走边找东西):