0

我有一个SchedulesController对应于Schedule不是 ActiveRecord 模型的类。中唯一的动作SchedulesControllershow

然后我有一个ShiftActiveRecord 模型和一个ShiftsController.

schedules/show视图中,有一个链接,用户可以单击以引入新的Shift. 此表单是ShiftsController通过 ajax 请求从 中检索的。因为请求 url 将被打包为schedules/shifts/new,所以我需要将shifts路由嵌套在schedules路由中。

但是,我想避免为 生成所有 RESTful 路由schedules,只是为了保持干净。我只需要show。这可以解决这个问题:

# config/routes.rb

get "schedules/show"
resources :schedules, only: [] do
  collection do
    resources :shifts
  end
end

请注意,我使用它get "schedules/show"是因为我不想show以通常的方式处理它,它需要一个 ID。我可能会更改show操作display以解决这种混乱。无论如何,这是生成的路线:

$ rake routes
Prefix         Verb   URI Pattern                          Controller#Action
schedules_show GET    /schedules/show(.:format)            schedules#show
shifts         GET    /schedules/shifts(.:format)          shifts#index
               POST   /schedules/shifts(.:format)          shifts#create
new_shift      GET    /schedules/shifts/new(.:format)      shifts#new
edit_shift     GET    /schedules/shifts/:id/edit(.:format) shifts#edit
shift          GET    /schedules/shifts/:id(.:format)      shifts#show
               PATCH  /schedules/shifts/:id(.:format)      shifts#update
               PUT    /schedules/shifts/:id(.:format)      shifts#update
               DELETE /schedules/shifts/:id(.:format)      shifts#destroy

该解决方案有效;我可以拉入页面new_shift上的schedules/show表格。问题是它创建了所有的 RESTful 路由schedules/shifts,而我现在只需要一个new. 所以我尝试了这个:

# config/routes.rb

get "schedule/show"
resources :schedules, only: [] do
  collection do
    resources :shifts, only: [:new]
  end
end

这就是我遇到问题的地方。以下是路线:

$ rake routes
Prefix         Verb URI Pattern                     Controller#Action
schedules_show GET  /schedules/show(.:format)       schedules#show
new_shift      GET  /schedules/shifts/new(.:format) shifts#new

这对我来说看起来不错(?)。但是,当我转到该schedules/show页面并单击应该引入new_shift表单的链接时,我得到了这个异常:

Started GET "/schedules/shifts/new" for 127.0.0.1 at 2013-09-29 19:59:52 -0400
  ActiveRecord::SchemaMigration Load (0.9ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by ShiftsController#new as HTML
  Rendered shifts/new.html.erb within layouts/application (135.6ms)
Completed 500 Internal Server Error in 272ms

ActionView::Template::Error (undefined method `shifts_path' for #<#<Class:0x7578de90>:0x7578d4d0>):
    1: <%= form_for @shift do |f| %>
    2:   <%= f.text_field :start_time %>
    3:   <%= f.text_field :end_time %>
    4: <% end %>
  app/views/shifts/new.html.erb:1:in `_app_views_shifts_new_html_erb__535553616_985195992'
  app/controllers/shifts_controller.rb:8:in `new'

我假设#<#<Class:0x7578de90>:0x7578d4d0>指的是我的Schedule班级,正如我上面所说的,它不是 ActiveRecord 模型。但是为什么它在这里不起作用,但是当我以另一种方式做的时候呢?在这两种情况下,GET /schedules/shifts/new(.:format)我运行时的路线完全相同rake routes

有任何想法吗?谢谢!

4

1 回答 1

1

按照 Rails 约定,您的表单试图向名为 的路径发出 POST 请求shifts_path,但它找不到该路径方法,因为没有为该#create操作定义路由。

您需要一条路线#create以及#new

resources :shifts, only: [:new, :create]
于 2013-09-30T00:33:16.423 回答