У меня есть SchedulesController
, который соответствует классу Schedule
, который не является моделью ActiveRecord. Единственное действие в SchedulesController
- show
.Рельсы 4 вложенных маршрута без всех маршрутов RESTful
Тогда у меня есть модель 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
быть обработаны обычным способом, где это требуется идентификатор. Я могу изменить действие 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
.
Любые идеи? Благодаря!
Ах, конечно. Благодаря! – grandinero