[英]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.rb在app/controllers/users
文件夹下
def show
end
show.html.slim在app/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.rb
, app/controllers/users/tasks_controller.rb
将它放在app/controllers/tasks_controller.rb
。
当TasksController#show
时,控制器的“嵌套”由包含:user_id
和:id
的params
对象处理。
您的问题是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.