- Konu sahibi
- #1
Rails’te “No route matches” hatasını çözmek için önce hata mesajındaki HTTP yöntemini ve yolu uygulamanızın tanımlı rotalarıyla karşılaştırın.
Hata metninde genellikle eşleşmeyen yol ve HTTP yöntemi, örneğin
Proje dizininde rotaları listeleyin:
Çıktıda hata mesajındaki yolu ve HTTP yöntemini arayın. Rota satırlarında genellikle yöntem, yol, rota adı ve controller/action bilgileri bulunur. Büyük çıktıda aramak için Unix benzeri kabuklarda
Bir rotanın yalnızca yolunun benzemesi yeterli değildir; istek yöntemi de rotayla eşleşmelidir. Örneğin aşağıdaki bildirim, makale listesi için
Rotanın bulunup bulunmadığını ve hangi noktayı kontrol edeceğinizi şu şekilde ayırabilirsiniz:
Rota listesinde doğru yöntem ve yol görünüyorsa bu, controller action’ın doğru çalıştığını veya ilgili kaydın veritabanında bulunduğunu kanıtlamaz. Bu durumda hatanın tam metnini ve logdaki isteği inceleyin; uygulama rota eşleştirmesini geçmiş olabilir, fakat daha sonraki bir işlem başarısız olmuş olabilir.
Rotayı bulamadıysanız
Bu bildirim
Rotayı bir
bin/rails routes çıktısında eşleşme yoksa veya yöntem farklıysa config/routes.rb dosyasındaki rotayı düzeltin; hata bir bağlantı ya da yönlendirme üretirken çıkıyorsa kullanılan yol yardımcısına ve parametrelere bakın. Düzeltmeden sonra rotaları yeniden listeleyip isteği aynı yöntem ve yolla tekrar deneyin.Hatanın nerede oluştuğunu belirleyin
Hata metninde genellikle eşleşmeyen yol ve HTTP yöntemi, örneğin
GET /articles/12, görünür. Hata bir form gönderiminde veya doğrudan URL isteğinde çıkıyorsa Rails’in bu isteği hangi controller ve action’a yönlendireceğini bulamadığı anlamına gelir. Bir sayfa oluşturulurken bağlantı veya yönlendirme üretilirken çıkıyorsa uygulamanın istediği URL’yi oluşturacak rota ya da gerekli parametre eksik olabilir. Bu iki durumu birbirinden ayırın: İlki gelen isteğin rotasını, ikincisi uygulamanın URL üretimini kontrol etmeyi gerektirir.Proje dizininde rotaları listeleyin:
Bash:
bin/rails routes
Çıktıda hata mesajındaki yolu ve HTTP yöntemini arayın. Rota satırlarında genellikle yöntem, yol, rota adı ve controller/action bilgileri bulunur. Büyük çıktıda aramak için Unix benzeri kabuklarda
bin/rails routes | grep articles kullanabilirsiniz; articles yerine hatadaki yolun ayırt edici bölümünü yazın. Windows kabuğunda grep yoksa tam çıktıyı inceleyin veya kabuğun arama aracını kullanın.Yol ve HTTP yöntemini eşleştirin
Bir rotanın yalnızca yolunun benzemesi yeterli değildir; istek yöntemi de rotayla eşleşmelidir. Örneğin aşağıdaki bildirim, makale listesi için
GET /articles ve yeni makale oluşturma isteği için POST /articles rotalarını üretir:
Ruby:
# config/routes.rb
resources :articles
POST /articles isteği gönderiyorsanız fakat rotalar listesinde yalnızca GET /articles gibi bir tanım varsa, formun method değerini ve rota bildirimini kontrol edin. Formun hangi yöntemi gönderdiğini tarayıcı geliştirici araçlarından veya uygulama logundan doğrulayın; eylem için uygun REST rotasını tanımlayın ya da formu mevcut rotanın yöntemine göre düzeltin. Rotayı değiştirdikten sonra bin/rails routes çıktısında yöntemin ve yolun göründüğünü doğrulayın.Rotanın bulunup bulunmadığını ve hangi noktayı kontrol edeceğinizi şu şekilde ayırabilirsiniz:
| Gözlenen durum | Kontrol edilecek yer |
|---|---|
| Yol hiç listelenmiyor | config/routes.rb içindeki rota bildirimi ve rota kapsamı |
| Yol var, yöntem farklı | Formun veya istemcinin gönderdiği HTTP yöntemi |
| Rota var, URL üretimi hata veriyor | Yol yardımcısı ve gereken parametreler |
| Yalnız bazı kayıt kimliklerinde hata | İsteğin gerçekten doğru yolu ve mevcut kaydı kullanıp kullanmadığı |
Rota bildirimi ve parametreleri düzeltin
Rotayı bulamadıysanız
config/routes.rb içindeki tanımın gelen yol ile aynı yapıda olduğundan emin olun. Örneğin /articles/12 yolu bir show action’ına yönlendirilecekse kaynak rotası tanımlı olmalıdır:
Ruby:
# config/routes.rb
resources :articles, only: [:show]
Bu bildirim
/articles/:id biçimindeki yolu oluşturur. URL üretirken article_path(@article) gibi bir yol yardımcısı kullanmak, kimlik parametresini elle birleştirme hatalarını azaltır. Özel bir rota kullanıyorsanız dinamik parçanın adını kontrol edin: get "articles/:id", to: "articles#show" tanımında beklenen parametre id olur; URL yardımcısına ilgili kaydı veya id değerini vermeniz gerekir.Rotayı bir
namespace, scope veya iç içe kaynak altında tanımladıysanız, rota listesinde görünen gerçek önek ve yardımcı adını esas alın. Örneğin yönetim alanındaki rota /admin/articles/:id olabilir; /articles/:id istemek aynı rotayla eşleşmez. Benzer biçimde, kaynak adı tekil-çoğul farklılığı veya rotadaki kısıtlar (constraints) beklenmeyen bir yolun eşleşmesini engelleyebilir. Yalnız rota listesindeki gerçek tanıma göre düzeltme yapın; aynı yolu karşılayan yeni bir rota ekleyerek belirsizlik yaratmayın.Düzeltmeyi doğrulayın
config/routes.rb değişikliğini kaydedin, bin/rails routes komutunu yeniden çalıştırın ve beklenen HTTP yöntemi, yol ve action’ın listelendiğini kontrol edin. Ardından isteği aynı yöntemle tekrar gönderin. Hata sürüyorsa hata mesajındaki tam yöntemi ve yolu, ilgili rota satırını ve isteğin nereden geldiğini (form, bağlantı, yönlendirme veya doğrudan URL) birlikte inceleyin. Kimlik içeren URL veya logları paylaşmanız gerekirse oturum belirteçlerini, kişisel verileri ve gizli parametreleri çıkarın; tanı amacıyla geçici olarak açtığınız ayrıntılı loglamayı iş bittiğinde kapatın.