我想向命名的路由/url 助手添加一些逻辑:
# app/helpers/my_helper.rb
module MyHelper
def article_path(obj, opts = {})
opts.merge!(token: @redis.get("token"))
super(obj, opts)
end
end
我也喜欢在每个控制器中获得相同的逻辑,所以我将它包含在我的 ApplicationController
中:
class ApplicationController < ActionController::Base
include TokenRoutesHelper
end
在一个视图中,helper 被覆盖,一切正常。但在控制器内部,它不会覆盖 article_path
助手。我也尝试过 prepend TokenRoutesHelper
,但这也不起作用。
我查看了 pry 的方法,似乎 Rails 将自己命名的路由助手放在任何包含的助手之前,甚至通过 prepend
添加时:
[1] pry(#<ArticlesController>)> show-source article_path
From: /usr/local/bundle/gems/actionpack-5.2.4.5/lib/action_dispatch/routing/route_set.rb:322:
Owner: #<Module:0x000055b67aa85bc0>
Visibility: public
Signature: article_path(*args)
Number of lines: 11
define_method(name) do |*args|
last = args.last
options = \
case last
when Hash
args.pop
when ActionController::Parameters
args.pop.to_h
end
helper.call self, args, options
end
[2] pry(#<ArticlesController>)> show-source article_path --super
From: /usr/src/app/app/helpers/my_helper.rb:4:
Owner: MyHelper
Visibility: public
Signature: article_path(obj, opts = {})
Number of lines: 4
def article_path(obj, opts = {})
opts.merge!(token: @redis.get("token"))
super(obj, opts)
end
[3] pry(#<ArticlesController>)>
那么,Rails 有没有办法覆盖它自动生成的 url 助手?