Rails 6如何指定命名空间外控制器?路由报错求解决
解决Rails 6中路由关注点引用外部控制器的错误
这个问题我之前也碰到过,Rails 6对路由里控制器的命名规范做了严格限制,原来那种带前导斜杠的写法('/comments')已经不被允许了,因为容易引发路由歧义,所以抛出了ArgumentError。不过有两种简单的办法可以解决这个问题:
方案一:指定完整的控制器类名(带根命名空间前缀)
直接用字符串形式指定根命名空间下的控制器类名,明确告诉Rails要使用根目录下的CommentsController,而不是Admin命名空间下的控制器:
concern :commentable do resources :comments, only: %i[create destroy], controller: '::CommentsController' end namespace :admin do resources :discussions, concerns: :commentable end
这里的::CommentsController表示根命名空间(非Admin模块)下的控制器,Rails会直接去app/controllers/comments_controller.rb中查找对应的类。
方案二:使用module: false取消命名空间前缀
另一种方式是保留控制器名称为'comments',同时添加module: false选项,让Rails不为该路由自动添加当前admin命名空间的模块前缀:
concern :commentable do resources :comments, only: %i[create destroy], controller: 'comments', module: false end namespace :admin do resources :discussions, concerns: :commentable end
这个选项会覆盖namespace :admin带来的模块前缀默认行为,确保路由指向根目录下的CommentsController。
两种方案都能解决你的问题,选哪种取决于个人习惯——第一种更明确,第二种写法更简洁。
内容的提问来源于stack exchange,提问作者Mihai
相关产品推荐
相关产品推荐

