используя form_for с единственной моделью - PullRequest
0 голосов
/ 28 октября 2011

У меня есть модель Wizard, на которую клиент ссылается без идентификатора (он сохраняется в сеансе), поэтому я создал отдельный ресурс для: show и: update.Я хочу, чтобы администратор имел доступ ко всем экземплярам этой модели через индекс, чтобы администратор мог удалять отклонения, поэтому я добавил множество ресурсов для: index и: destroy.Индекс и уничтожение работают, но я не могу найти правильные аргументы для передачи в form_for в представлении обновлений.

Настройка

# config/routes.rb
WTest::Application.routes.draw.do
  resource :wizard, :only => [:show, :update]
  resources :wizards, :only => [:index, :destroy]
  ...
end

, что приводит к

$ rake routes
wizards GET    /wizards(.:format)     {:action=>"index", :controller=>"wizards"}
 wizard DELETE /wizards/:id(.:format) {:action=>"destroy", :controller=>"wizards"}
        GET    /wizard(.:format)      {:action=>"show", :controller=>"wizards"}
        PUT    /wizard(.:format)      {:action=>"update", :controller=>"wizards"}

Это устанавливает маршруты так, как я ожидал.

Вопрос (исправленный с оригинального поста)

В консоли:

>> app.wizard_path

выдает ошибку ActionController::RoutingError: No route matches {:action=>"destroy", :controller=>"wizards"}

Почему это так?Я неправильно настроил свои маршруты?Мне нужно указать :url => wizard_path для form_for () в представлении обновлений мастеров.

Подробности

Если я укажу явный путь в моем вызове form_for:

# app/view/wizards/update.html.erb
<%= form_for @wizard, :url => wizard_path do |f| %>
  <%= f.submit %>
<% end %>

... затем попытка сделать это для for приводит к ошибке в строке form_for:

No route matches {:action=>"destroy", :controller=>"wizards"}

Я понятия не имею, почему он пытается сопоставить действие уничтожения.Как получить форму для отправки по маршруту {action=>"update", :controller=>"wizards"}?

(Кстати, я посмотрел на ошибка 267 , и я не думаю, что это то же самое, чтоЯ наблюдаю. Но если это эта ошибка, есть ли обходной путь?)

1 Ответ

0 голосов
/ 28 октября 2011

Продолжая давнюю традицию отвечать на мои собственные вопросы (да!), Я думаю, что я понял это. Если мой анализ неверен, я был бы рад поставить кому-то еще галочку ...

причина проблемы

Посмотрите на вывод rake routes

$ rake routes
wizards GET    /wizards(.:format)     {:action=>"index", :controller=>"wizards"}
 wizard DELETE /wizards/:id(.:format) {:action=>"destroy", :controller=>"wizards"}
        GET    /wizard(.:format)      {:action=>"show", :controller=>"wizards"}
        PUT    /wizard(.:format)      {:action=>"update", :controller=>"wizards"}

Метод пути 'wizard_path' неоднозначен: он может либо ссылаться на предложение DELETE, в этом случае ему нужен аргумент: id (wizard_path(22)), либо он может ссылаться на предложения GET и PUT, в этом случае он не принимает аргумент ID.

Решение

Таким образом, мое решение состояло в том, чтобы создать маршрут специально для удаления. Мой исправленный файл routes.rb теперь читает:

resources :wizards, :only => [:index]
resource :wizard, :only => [:show, :update]
match 'wizard/:id' => 'wizards#destroy', :via => :delete, :as => :delete_wizard

и rake routes теперь производят:

$ rake routes
      wizards GET    /wizards(.:format)    {:action=>"index", :controller=>"wizards"}
       wizard GET    /wizard(.:format)     {:action=>"show", :controller=>"wizards"}
              PUT    /wizard(.:format)     {:action=>"update", :controller=>"wizards"}
delete_wizard DELETE /wizard/:id(.:format) {:controller=>"wizards", :action=>"destroy"}

Мне нужно было сделать однострочное изменение ссылки на удаление в wizards / index.html.erb, чтобы использовать новый delete_wizard_path, но теперь все работает.

...