如何覆盖ommiauth库方法

时间:2015-12-13 08:01:06

标签: ruby-on-rails omniauth

我是ruby的新手并试图覆盖omniauth库方法。我想支持env.header Please see this pull request on omniauth。那么如何在我的项目中进行这些更改呢?

1 个答案:

答案 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

奇怪的别名语法是因为它不是方法而是语法糖。