我正在尝试修改gem(精确设计令牌身份验证)以满足我的需要。为此,我想覆盖关注SetUserByToken中的某些函数。
问题是如何覆盖它?
我不想更改gem文件。有没有简单/标准的方法呢?
答案 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
如果要扩展现有方法的行为,请尝试在别名周围使用: