覆盖宝石的关注 - Rails

时间:2016-05-15 11:00:44

标签: ruby-on-rails override

我正在尝试修改gem(精确设计令牌身份验证)以满足我的需要。为此,我想覆盖关注SetUserByToken中的某些函数。

问题是如何覆盖它?

我不想更改gem文件。有没有简单/标准的方法呢?

2 个答案:

答案 0 :(得分:2)

请记住,Rails中的“关注点”只是一个具有ActiveSupport::Concern程序员便利性的模块。

当您在类中包含模块时,类中定义的方法将优先于包含的模块。

module Greeter
  def hello
    "hello world"
  end
end

class LeetSpeaker
  include Greeter
  def hello 
    super.tr("e", "3").tr("o", "0")
  end
end

LeetSpeaker.new.hello # => "h3ll0 w0rld"

所以你可以简单地在ApplicationController中重新定义所需的方法,甚至可以在没有猴子修补库的情况下编写自己的模块:

module Greeter
  extend ActiveSupport::Concern

  def hello
    "hello world"
  end

  class_methods do
     def foo
       "bar"
     end
  end
end

module BetterGreeter
  extend ActiveSupport::Concern

  def hello
    super.titlecase
  end

  # we can override class methods as well.
  class_methods do
     def foo
       "baz"
     end
  end
end

class Person
  include Greeter # the order of inclusion matters
  include BetterGreeter
end

Person.new.hello # => "Hello World"
Person.foo # => "baz"

请参阅Monkey patching: the good, the bad and the ugly以获得一个很好的解释,为什么最好将自定义代码覆盖在框架或库之上,而不是在运行时修改库组件。

答案 1 :(得分:0)

你可以像任何其他模块一样关注补丁问题:

module DeviseTokenAuth::Concerns::SetUserByToken
  # Your code here
end

如果要扩展现有方法的行为,请尝试在别名周围使用

http://rubyquicktips.com/post/18427759343/around-alias