Вопрос о маршрутизации Rails - нет совпадений маршрута

У меня есть модель «Работа», к которой я добавляю новое действие «Предварительный просмотр». Для поддержки этого нового действия я изменил route.rb следующим образом:

resources :jobs do
   member do
      get 'preview'
   end
end

Затем на моей работе создайте действие, у меня есть следующее:

 if @job.save
    redirect_to preview_job_url

Однако, когда я сохраняю форму, вместо перенаправления на URL-адрес предварительного просмотра я получаю следующую ошибку маршрутизации:

Routing Error
No route matches {:action=>"preview", :controller=>"jobs"}

Не могу понять, почему это происходит, так как URL-адрес работает правильно (http://localhost:3000/jobs/id/preview), и если я запускаю рейк-маршруты, кажется, что правильный маршрут есть:

preview_jobs GET    /jobs/preview(.:format)            {:action=>"preview", :controller=>"jobs"}

Любые идеи относительно того, что может происходить? Кажется, что все части на месте, но я новичок в Rails, поэтому я уверен, что упускаю что-то очевидное. Большое спасибо.


person cman77    schedule 06.03.2011    source источник
comment
Вы подтвердили, что действительно получили запрос GET? Что произойдет, если вы откроете /jobs/preview/1 в браузере?   -  person Jeff Paquette    schedule 07.03.2011


Ответы (1)


Вы определили «предварительный просмотр» как действие члена. Действия членов относятся к экземпляру модели. Когда вы вызываете preview_job_url, вам нужно передать конкретный объект задания или идентификатор задания, чтобы можно было создать URL-адрес. Это должно иметь смысл... как Rails может построить вам URL-адрес, который ссылается на конкретную модель, если вы не сообщите фреймворку, для какого задания вы хотите создать URL-адрес?

Попробуйте это в своем контроллере:

if @job.save
  redirect_to preview_job_url(@job)
person MDaubs    schedule 07.03.2011
comment
В вашем исходном вопросе ваш фрагмент из rake route не совпадает с вашим фрагментом из route.rb. preview_jobs => /jobs/preview(.:format) — это действие над набором заданий, а preview_job => /jobs/:id/preview(.:format) — действие над членом набора заданий. Другими словами, preview_job_url(@job) => "/jobs/1234/preview" и preview_jobs_url => "/jobs" предполагают, что оба определены в route.rb (что было бы странно). Есть смысл? Немного сложно привыкнуть. Мы все были там. Я подозреваю, что у вас где-то есть лишний s. - person MDaubs; 07.03.2011