我是ruby的新手并试图覆盖omniauth库方法。我想支持env.header Please see this pull request on omniauth。那么如何在我的项目中进行这些更改呢?
答案 0 :(得分:0)
在Ruby类中,可以简单地覆盖mixin(包含的模块)提供的任何方法:
module Strategy
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def hello
"Hello from Strategy"
end
end
end
class MyStrategy
include Strategy
def self.hello
"Hello from MyStrategy"
end
end
puts MyStrategy.hello
这意味着策略作者可以在创作策略类时简单地覆盖任何方法。因此,您可以简单地覆盖策略中的request_call
方法,这是一种更好的选择,因为大多数策略都不需要将所有请求标头存储在会话中。
由于OmniAuth::Strategy
是一个模块而不是一个类,因此您无法使用super
来调用原始方法。你可以做的是在你的类中覆盖它之前为mixin方法添加别名:
module OmniAuth
class MyStrategy
include Strategy
class << self
alias :original_request_call :request_call
end
def self.request_call
session['omniauth.headers'] = headers
original_request_call
end
# ...
end
end
奇怪的别名语法是因为它不是方法而是语法糖。