ActiveRecord::RecordNotFound Hatası Nedir?
Örnek senaryo:
Diyelim ki bir blog uygulaması geliştiriyorsunuz ve bir yazıyı ID'sine göre görüntülemek istiyorsunuz. Eğer kullanıcının istediği ID veritabanında mevcut değilse, Rails hemen bir RecordNotFound hatası verir.
```ruby
class PostsController < ApplicationController
def show
@post = Post.find(params[:id]) # params[:id] üzerinden yazıyı bulmaya çalışıyoruz
end
end
```
Eğer `params[:id]` değeri veritabanında yoksa, yukarıdaki kod şu hatayı fırlatır:
```
ActiveRecord::RecordNotFound (Couldn't find Post with 'id'=
```
Neden Bu Hata ile Karşılaşırız?
1. Yanlış ID: Veritabanında olmayan bir ID ile sorgu yapıldığında.
2. Veri Silinmiş: Kullanıcı, bir veriyi silmiş ancak aynı veriye tekrar erişmeye çalışmış olabilir.
3. Veritabanı Hatası: Veritabanı ile bağlantı problemleri veya diğer veri tutarsızlıkları.
Hata Yönetimi
```ruby
class PostsController < ApplicationController
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
def show
@post = Post.find(params[:id])
end
private
def record_not_found
flash[:error] = "Aradığınız yazı bulunamadı!"
redirect_to posts_path
end
end
```
Yukarıdaki kodda, rescue_from kullanarak, ActiveRecord::RecordNotFound hatası oluştuğunda record_not_found metodunun çalışmasını sağlıyoruz. Bu metot, kullanıcıyı posts_path sayfasına yönlendirip, ona anlamlı bir hata mesajı gösterecektir.
Veritabanı Sorguları ile Hata Yönetimi
```ruby
class PostsController < ApplicationController
def show
@post = Post.find_by(id: params[:id])
if @post.nil?
flash[:error] = "Aradığınız yazı bulunamadı!"
redirect_to posts_path
end
end
end
```
Daha Güvenli ve Verimli Yöntemler
- where: Çoklu kayıtları sorgularken de where metodu kullanılabilir. Bu metod, birden fazla kayıt döndürebilir ve hata fırlatmaz.
```ruby
@posts = Post.where(category: 'Tech')
```
Sonuç
Unutmayın, her hata fırsattır ve doğru yönetildiğinde kullanıcılarınıza daha iyi bir deneyim sunmanıza olanak sağlar!