Ошибка несоответствия маршрута — с вложенным ресурсом

#ruby-on-rails #ruby #routing #rails-routing

#ruby-on-rails #ruby #маршруты #rails-маршрутизация

Вопрос:

В моем routes.rb файле есть следующий вложенный ресурс

   resource :issuer do
    resources :certificates
  end
  

Мои модели:

 class Issuer < ActiveRecord::Base
  has_many :certificates
end

class Certificate < ActiveRecord::Base
  belongs_to :issuer
end
  

Я получаю следующую ошибку при посещении: /issuer/2/certificates

No route matches {:action=>"edit", :controller=>"certificates"}

Буду признателен за любую помощь.. Заранее спасибо!

РЕДАКТИРОВАТЬ: МОЙ rake routes

     issuer_certificates GET    /issuer/:issuer_id/certificates(.:format)          {:action=>"index", :controller=>"certificates"}
                        POST   /issuer/:issuer_id/certificates(.:format)          {:action=>"create", :controller=>"certificates"}
 new_issuer_certificate GET    /issuer/:issuer_id/certificates/new(.:format)      {:action=>"new", :controller=>"certificates"}
edit_issuer_certificate GET    /issuer/:issuer_id/certificates/:id/edit(.:format) {:action=>"edit", :controller=>"certificates"}
     issuer_certificate GET    /issuer/:issuer_id/certificates/:id(.:format)      {:action=>"show", :controller=>"certificates"}
                        PUT    /issuer/:issuer_id/certificates/:id(.:format)      {:action=>"update", :controller=>"certificates"}
                        DELETE /issuer/:issuer_id/certificates/:id(.:format)      {:action=>"destroy", :controller=>"certificates"}
  

Ответ №1:

Вы должны использовать ресурсы (множественное число) вместо resource в refer to :issuer. Поэтому, пожалуйста, попробуйте это:

 resources :issuers do
   resources :certificates
end
  

и issuers/2/certificates будет работать.

Комментарии:

1. пожалуйста, посмотрите: guides.rubyonrails.org/routing.html#nested-resources . Это именно ваш случай, решенный моим способом 🙂

Ответ №2:

В вашем файле routes.rb вы определяете эмитента как отдельный ресурс

   resource :issuer do         # <-----  using resource instead of resources
    resources :certificates
  end 
  

При использовании отдельных ресурсов полученные вами маршруты не позволяют сопоставлять :id, поэтому в вашем примере,

 issuer/2/certificates
  

это «2», которое доставляет вам огорчение. Вы должны либо избавиться от этого, либо определить:issuer как стандартный (неособый) ресурс в вашем файле routes.rb.

Комментарии:

1. Неважно. Из опубликованных вами выходных данных rake routes я вижу, что issuer_ids совпадают. Вероятно, вы просто допустили опечатку в routes.rb в своем вопросе.

Ответ №3:

У вас не PUT определено для /issuer/2/certificates . вместо этого вы определили его для /issuer/2/certificates/123 . Вот почему вы получаете эту ошибку.

Если вы пытаетесь отредактировать certificate , убедитесь, что вы сгенерировали правильную ссылку и включили certificate_id .