我有一个SchedulesController
对应于Schedule
不是 ActiveRecord 模型的类。中唯一的动作SchedulesController
是show
。
然后我有一个Shift
ActiveRecord 模型和一个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
。
有任何想法吗?谢谢!