我的路线/资源和控制器出错了。
我在routes.rb中有以下内容:
# routes.rb
resources :users do
resource :schedule
end
我在控制器/用户/内部设置了schedule_controller.rb,我认为它应该是:
class Users::ScheduleController < ApplicationController
# Controller methods here...
end
运行rake:路线显示
user_schedule POST /users/:user_id/schedule(.:format) schedules#create
new_user_schedule GET /users/:user_id/schedule/new(.:format) schedules#new
edit_user_schedule GET /users/:user_id/schedule/edit(.:format) schedules#edit
GET /users/:user_id/schedule(.:format) schedules#show
PUT /users/:user_id/schedule(.:format) schedules#update
但是,导航到/ users /:user_id / schedule会返回以下错误:
uninitialized constant SchedulesController
我对问题可能是什么的唯一想法是与嵌套资源或声明单个资源有关,而我在某处出错。
我正在使用助手
new_user_schedule_path(current_user)
链接到我的“新”视图时。
答案 0 :(得分:15)
应该是SchedulesController
,而不是Users::ScheduleController
。只有当路由为namespaced with namespace
时,控制器才应该被命名空间。控制器名称也应始终为复数。
您要创建的是nested resource,而不是命名空间。
答案 1 :(得分:3)
SchedulesController
的名称空间是否有意?即你真的意味着这样做吗?
class Users::SchedulesController < ApplicationController
或者你只是这样做,因为时间表是用户的“子事”?
我之所以这么说是因为通常在Rails中,嵌套资源控制器不是命名空间。如果要在命名空间下以特殊方式修改控制器,则只能命名控制器。一个常见的例子就是在管理命名空间下有一些控制器,继承自该命名空间中的BaseController
,只会限制管理员访问这些控制器。
如果您没有故意命名此控制器,那么您希望从控制器中删除Users::
前缀,并将其移回app/controllers/schedules_controller.rb
,帮助程序返回到app/helpers/schedules_helper.rb
,将视图追溯到app/views/schedules
。也许您运行了一个生成Users::Schedule
模型的生成器,该模型还需要重命名为Schedule
并移回app/models/schedule.rb
。
如果故意命名空间此控制器,那么您希望在路由中执行此操作:
namespace :users do
resources :schedules
end
保留所有已生成的内容。
答案 2 :(得分:1)
在routes.rb中,你需要像这样指定控制器:
resources :users do
resource :schedules, controller: 'users/shedules'
end
答案 3 :(得分:0)
替换资源:用户来 namespace:users
因为您的计划控制器位于用户文件夹中。 class Users :: ScheduleController&lt; ApplicationController的 #控制器方法在这里...... 端