2013-09-30 5 views
0

У меня есть 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.

Любые идеи? Благодаря!

ответ

1

По правилам Rails ваша форма пытается выполнить запрос POST по пути с именем shifts_path, только он не может найти этот путь, потому что для действия #create не существует маршрута.

Вам нужен маршрут для #create, а также #new.

resources :shifts, only: [:new, :create] 
+0

Ах, конечно. Благодаря! – grandinero

Смежные вопросы