【问题标题】:rails routes with :id not working带有:id的rails路线不起作用
【发布时间】:2013-12-06 15:14:51
【问题描述】:

我有一个名为 Schedule 的模型,它属于一个项目。一个项目有一个时间表。我正在尝试遵循 CRUD 约定,但遇到了一些困难。我有一个列出所有项目的页面,并且每个项目旁边都有一个链接来创建时间表。我从我的路由文件中的以下内容开始:

resources :schedules

这就是问题所在。在“新日程”页面的 url 中,需要有一个 :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

这使得新日程的 url 采用以下形式:

/projects/:project_id/schedules/new(.:format)

我认为应该这样做,但是,新时间表的表格写成

form_for @schedule

这会产生以下错误:

undefined method `schedules_path'

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails routes ruby-on-rails-4 rails-routing activeresource


    【解决方案1】:

    由于您有一个嵌套资源/路由,您需要传递一个数组,其中包含@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 对象(根据定义,它还没有分配id 属性)。

    【讨论】:

    • 谢谢。这几乎解决了它。但由于某种原因,它不会保存。当我提交表单时,它给了我以下错误:'can't write unknown attribute `schedule_id''。
    • 这个错误在哪一行?请更新您的问题以包含您的控制器代码/堆栈跟踪。
    • 我收到的一些关于堆栈溢出的最快和最好的建议。非常感谢!
    • 您对此非常有帮助。完成此操作后,我遇到了另一个问题。我会很感激你的帮助。我在这里发布了问题:stackoverflow.com/questions/20152691/…。非常感谢!
    • 我已经为您的问题添加了答案...如果它解决了您的问题,请考虑接受/支持。
    【解决方案2】:

    如果您以这种方式嵌套资源,则所有调度方法助手都需要以 projectprojects 开头。例如,项目_schedules_path。这就是您收到该错误的原因。您的链接使用了错误的路径助手。

    http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects

    【讨论】:

      【解决方案3】:

      如果您使用自定义视图,例如 shedules/get,您应该在 config/routes.rb 文件中添加 get "shedules/get" 行 p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多