我有一个名为Schedule的模型,属于一个项目。一个项目有一个时间表。我试图遵循CRUD惯例,但有一些困难。我有一个列出所有项目的页面,并在每个项目旁边都有一个链接来创建计划。我在路线文件中开始使用以下内容:
resources :schedules
这是问题所在。在“新计划”页面的网址中,需要有一个:id,指的是计划所属的项目,当创建计划时,它将属于正确的项目。我不知道如何用资源做到这一点,所以我将我的路线代码改为:
match 'schedules/new/:id', to: 'schedules#new', as: :new_schedule, via: [:get, :post]
resources :schedules, except: [:new, :create]
由于某种原因,此页面为空白。它只是白色的。如何修复路线?感谢。
更新:
我也尝试将路线更改为以下内容:
resources :projects do
resources :schedules
end
这使得新计划的网址形式为:
/projects/:project_id/schedules/new(.:format)
我认为这是应该如何完成的,但是,新计划的表格写成
form_for @schedule
并产生以下错误:
undefined method `schedules_path'
有什么想法吗?
答案 0 :(得分:2)
由于您有一个嵌套的资源/路由,您需要传递一个包含@schedule
实例变量(保存新的Schedule
对象)的数组以及@project实例变量(保存父项) Project
对象form_for
:
form_for [@project, @schedule]
<强>说明强>:
您的命名匹配路由(即match 'schedules/new/:id'
)无法路由,因为schedules#new
控制器操作是RESTful,因此does not accept an id
parameter。但是,您在更新中正确修改了路线 - 项目/时间表之间的父子关联应该通过嵌套资源确实在路线中表示。
生成的路径 - /projects/:project_id/schedules/new
- 要求将一组对象传递给您的form_for
助手。第一个必须是现有的Project
对象(因此满足:project_id
参数),第二个必须是新的Schedule
对象(根据定义,它不会有{{1}已分配的属性)。
答案 1 :(得分:0)
如果您使用自定义视图,例如 shedules/get
,则应在 get "shedules/get"
<中添加 config/routes.rb
行/ strong>文件
答案 2 :(得分:0)
如果以这种方式嵌套资源,则所有计划方法助手都需要在项目或项目之前。例如, project _schedules_path。这就是你得到这个错误的原因。你有一个使用错误的路径助手的链接。
请参阅http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects