繁体   English   中英

Rails 路由错误:带有嵌套资源的未初始化常量

[英]Rails Routing Error: Uninitialized Constant with Nested Resources

由于 rake 路线给出了我访问过的确切路线,页面显示
Routing Error uninitialized constant TasksController Did you mean? AppsController

routes.rb我写

  resources :users do 
    resources :tasks do
      collection do
        post 'tasks-info', to: 'users/tasks#tasks_info', format: 'json'
      end
    end
  end

tasks_controller.rbapp/controllers/users文件夹下

def show
end

show.html.slimapp/views/users/tasks夹下
我访问的 url 是http://localhost:3000/users/1/tasks/1 ,其中包含rake routes包括
user_task_path GET /users/:user_id/tasks/:id(.:format) tasks#show

我真的不知道错误来自哪里,真的很感激任何帮助!

更新:问题已解决,如果您有同样的问题,请参考下面的评论(我根据自己的理解进行了总结,但不确定是否完全正确)! 或者请参阅下面的答案,因为 Engineermnky 和 ​​Scott 的答案都应该有效。

关键是rails routes告诉你的:

user_task_path  GET /users/:user_id/tasks/:id(.:format)  tasks#show

最后一部分告诉您它正在tasks控制器中寻找show方法——即,位于控制器层次结构顶层的TasksController

因此,与其将TasksController放在app/controllers/users/tasks_controller.rbapp/controllers/users/tasks_controller.rb将它放在app/controllers/tasks_controller.rb

TasksController#show时,控制器的“嵌套”由包含:user_id:idparams对象处理。

您的问题是resources :tasks推断TasksController但您希望Users::TasksController处理这些操作。

Rails 提供了一种方法来处理这种类型的路由ActionDispatch::Routing::Mapper::Scoping#scope

要实现这一点,您所要做的就是使用scope方法向您的结构添加另一个级别,如下所示:

  resources :users do 
    scope module: 'users' do 
      resources :tasks do
        collection do
          post 'tasks-info', to: 'users/tasks#tasks_info', format: 'json'
        end
      end
    end
  end

现在所有到用户任务的嵌套路由都将转到Users::TasksController因为我们指定Task位于Users模块中。 您有问题的路线现在看起来像这样(在rails routes输出中):

user_task_path  GET /users/:user_id/tasks/:id(.:format)  users/tasks#show

我假设 users 是您在该场景中存储任务控制器的文件夹,您应该使用不同的密钥而不是使用资源。 一次只能有一个资源,我们不能在另一个资源中没有资源。 从技术上讲,它表明我们在控制器中安装了控制器,这是不可能的。

namespace :users do
  resources :tasks do
    collection do
      post 'tasks-info', to: 'users/tasks#tasks_info', format: 'json'
    end
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM