提问人:Pascal Lindelauf 提问时间:5/9/2023 更新时间:5/9/2023 访问量:81
升级到 Rails 7 后在路由中找不到命名空间的约束类
Namespaced constraint classes not found in routes after upgrade to Rails 7
问:
我一直在使用约束类,如下所示:routes.rb
get '/auth/:provider/callback', to: "oauth_accounts#create_or_update", constraints: Constraints::OmniauthCallbackConstraint.new
但是在升级到 Rails 7 后,我在启动应用程序时出现以下错误:
NameError: uninitialized constant Constraints
约束类位于文件夹中,并由如下所示的模块命名:/lib/constraints/
module Constraints
class OmniauthCallbackConstraint
def matches?(request)
...
end
end
end
此特定文件称为 ./lib/constraints/omniauth_callback_constraint.rb
我以为解决方案是在 中使用 明确要求此约束文件,但随后出现错误:routes.rb
require 'omniauth_callback_constraint'
Zeitwerk::NameError: expected file /lib/constraints/omniauth_callback_constraint.rb to define constant OmniauthCallbackConstraint, but didn't
我想它似乎无法解析模块名称。我也试过了,但这会导致同样的错误。require 'constraints/omniauth_callback_constraint'
这是怎么回事?从现在开始,当我使用自定义约束类时,我是否总是需要 in?或者我是否在我的 中缺少配置?如果我需要 ,包含上面所示的命名空间约束的正确语法是什么?require
routes.rb
application.rb
require
答:
0赞
Arctodus
5/9/2023
#1
我在解析模块名称时遇到了类似的问题,并通过定义一个空模块文件解决了它
# /lib/constraints.rb
module Constraints
end
评论
0赞
Pascal Lindelauf
5/9/2023
那么你的陈述是什么样子的呢?我用几种语句组合添加了这个,但仍然没有运气......require
require
1赞
Arctodus
5/9/2023
我已经将文件放在自动加载的目录中,因此不需要手册,我可以回忆起来
0赞
Pascal Lindelauf
5/9/2023
谢谢!这导致我走上了进一步调查我的autoload_paths的道路,结果发现我的旧语法现在无效,应该是.我什至不需要冗余文件。config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths << "#{root}/lib"
constraints.rb
0赞
Xavier Noria
5/9/2023
嗯,这里少了点什么。通配符的问题在于,你会得到额外的东西,这些东西甚至在经典中都不是用来表示命名空间的。像 ,球体可以扩展到。所以,为了干净起见,你不需要通配符。您现在和之前只想要一个项目。话虽如此,但是,通配符扩展也包括在内,所以我不太明白为什么它没有找到.是否有可能恢复以前的配置,抛出并观察跟踪?Object
lib/assets
lib
Constraints
Rails.autoloaders.log!
lib
0赞
Xavier Noria
5/9/2023
啊,我知道发生了什么。应用程序具有,并且由 glob 返回。支持嵌套根目录,嵌套最多的根目录获胜,因此表示而不是 .看看我之前的意思,glob 返回的东西不应该是自动加载路径。 容忍这是实现的副作用,但从概念上讲,它同样毫无意义。lib/constraints
lib/constraints
Object
Constraints
classic
0赞
Pascal Lindelauf
5/9/2023
#2
在@Arctodus和@widjajayd的帮助下(谢谢!),我很快发现罪魁祸首是我的 .而不是:autoload_paths
application.rb
config.autoload_paths += Dir["#{config.root}/lib/**/"]
现在应该是
config.autoload_paths << "#{root}/lib"
背景信息可在 Zeitwerk 文档的本段中找到。
评论