- Konu sahibi
- #1
İlk paragrafta ana yanıtı, izlenecek yolu ve ulaşılabilecek sonucu doğrudan ver. Rails’te resim yüklemek için en uygun yerleşik çözüm Active Storage’dır: Active Storage’ı kurup bir modele dosya ilişkilendirir, formda dosya alanı oluşturur ve kaydı
Önce proje dizininde Active Storage tablolarını oluşturun:
İlk komut Active Storage’ın ihtiyaç duyduğu migration dosyasını oluşturur. İkinci komut bu tabloları veritabanına ekler. Bu tablolar, resmin kendisini doğrudan model tablosuna yazmak yerine yüklenen dosyanın kimliğini, adını, türünü ve depolama bilgilerini tutar.
Yerel geliştirme ortamında dosyalar genellikle uygulamanın depolama dizininde tutulur. Üretim ortamında ise yerel disk, nesne depolama hizmeti veya başka bir depolama sürücüsü seçilebilir. Resim dosyasını yalnızca veritabanına bir metin alanı ekleyerek yüklemek Active Storage kurulumu yerine geçmez.
Örneğin
Bu tanım resmi henüz yüklemez; yalnızca model ile Active Storage arasındaki ilişkiyi kurar. Resmin kaydedilmesi için formdan gelen dosyanın güçlü parametrelerle kabul edilmesi gerekir.
Dosya alanı resim seçmeyi sağlar;
Denetleyicide
Resim türü ve boyutu için modelde doğrulama da ekleyebilirsiniz:
Bu doğrulama başarısız olursa
Kayıt başarıyla oluşturulduktan sonra görünümde resim ekli olup olmadığını kontrol ederek görüntüleyin:
Birden fazla resim için görünüm şu şekilde yazılabilir:
Büyük resimleri doğrudan göstermek yerine Active Storage varyantlarıyla boyutlandırabilirsiniz. Bunun için projede ImageMagick veya libvips gibi desteklenen bir görüntü işleme aracı ve ilgili Ruby paketi kurulu olmalıdır.
Bu kod özgün dosyayı değiştirmez; istenen boyuta uygun bir türetilmiş görsel üretir. Görüntü işleme aracı kurulmamışsa varyant oluşturma aşamasında hata alabilirsiniz. Yalnızca dosyanın yüklenmesi gerekiyorsa varyant kullanmak zorunlu değildir.
Dosya yükleme formunda özellikle
Bu akışın en küçük çalışan özeti; Active Storage migration’larını çalıştırmak, modele
multipart/form-data olarak gönderirsiniz. Kayıt başarılı olduğunda resim, modelin ek dosyası olarak saklanır; görüntülemek için Active Storage’ın URL yardımcılarını kullanırsınız.Active Storage’ı projeye ekleme
Önce proje dizininde Active Storage tablolarını oluşturun:
Bash:
bin/rails active_storage:install
bin/rails db:migrate
İlk komut Active Storage’ın ihtiyaç duyduğu migration dosyasını oluşturur. İkinci komut bu tabloları veritabanına ekler. Bu tablolar, resmin kendisini doğrudan model tablosuna yazmak yerine yüklenen dosyanın kimliğini, adını, türünü ve depolama bilgilerini tutar.
Yerel geliştirme ortamında dosyalar genellikle uygulamanın depolama dizininde tutulur. Üretim ortamında ise yerel disk, nesne depolama hizmeti veya başka bir depolama sürücüsü seçilebilir. Resim dosyasını yalnızca veritabanına bir metin alanı ekleyerek yüklemek Active Storage kurulumu yerine geçmez.
Modele resim ilişkisi ekleme
Örneğin
Post modeline bir resim ekleyecekseniz model dosyasına has_one_attached tanımını yazın:
Ruby:
class Post < ApplicationRecord
has_one_attached :image
end
has_one_attached :image, her Post kaydına tek bir resim eklenebileceği anlamına gelir. Aynı kayda birden fazla resim bağlamak istiyorsanız has_many_attached :images kullanılır:
Ruby:
class Post < ApplicationRecord
has_many_attached :images
end
Bu tanım resmi henüz yüklemez; yalnızca model ile Active Storage arasındaki ilişkiyi kurar. Resmin kaydedilmesi için formdan gelen dosyanın güçlü parametrelerle kabul edilmesi gerekir.
Formda dosya seçme alanı oluşturma
app/views/posts/_form.html.erb içinde formun dosya gönderebilecek şekilde oluşturulması gerekir:
Kod:
<%= form_with model: @post do |form| %>
<div>
<%= form.label :title, "Başlık" %>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :image, "Resim" %>
<%= form.file_field :image, accept: "image/*" %>
</div>
<%= form.submit "Kaydet" %>
<% end %>
Dosya alanı resim seçmeyi sağlar;
accept: "image/*" tarayıcıya resim dosyalarının tercih edilmesi gerektiğini bildirir. Bu ifade tek başına güvenlik doğrulaması değildir. Gönderilen dosyanın gerçekten kabul edilebilir türde ve boyutta olup olmadığını sunucu tarafında da denetlemelisiniz.Dosyayı denetleyip kaydetme
Denetleyicide
image parametresini izin verilen alanlar arasına ekleyin:
Ruby:
class PostsController < ApplicationController
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: "Yazı ve resim kaydedildi."
else
render :new, status: :unprocessable_entity
end
end
private
def post_params
params.require(:post).permit(:title, :image)
end
end
permit(:image) bulunmazsa dosya parametresi güvenlik nedeniyle modele aktarılmaz. Form doğru görünse bile kayıt sonrasında resim eklenmemişse ilk kontrol edilmesi gereken yerlerden biri bu güçlü parametre tanımıdır.Resim türü ve boyutu için modelde doğrulama da ekleyebilirsiniz:
Ruby:
class Post < ApplicationRecord
has_one_attached :image
validates :image,
content_type: ["image/png", "image/jpeg", "image/webp"],
size: { less_than: 5.megabytes }
end
Bu doğrulama başarısız olursa
save değeri false döner ve kayıt yapılmaz. Formda hata mesajlarını gösterirseniz kullanıcı dosyanın neden reddedildiğini görebilir. Tarayıcıdaki accept seçeneği yalnızca kullanıcı arayüzü kolaylığı sağladığından, güvenlik ve veri kalitesi için asıl kontrol model veya sunucu tarafında yapılmalıdır.Yüklenen resmi sayfada gösterme
Kayıt başarıyla oluşturulduktan sonra görünümde resim ekli olup olmadığını kontrol ederek görüntüleyin:
Kod:
<% if @post.image.attached? %>
<%= image_tag @post.image, alt: @post.title %>
<% end %>
attached? değeri true ise model ile bir Active Storage eki ilişkilendirilmiştir. Bu, dosyanın her ortamda erişilebilir olduğu veya görselin istenen boyutta olduğu anlamına gelmez; depolama ayarı, dosya izinleri ve görüntüleme URL’si ayrıca doğru olmalıdır. false dönüyorsa yükleme gerçekleşmemiştir; güçlü parametreleri, formun dosya alanını ve migration’ların çalıştırıldığını kontrol edin.Birden fazla resim için görünüm şu şekilde yazılabilir:
Kod:
<% @post.images.each do |image| %>
<%= image_tag image, alt: @post.title %>
<% end %>
Resmi yeniden boyutlandırma veya küçük önizleme üretme
Büyük resimleri doğrudan göstermek yerine Active Storage varyantlarıyla boyutlandırabilirsiniz. Bunun için projede ImageMagick veya libvips gibi desteklenen bir görüntü işleme aracı ve ilgili Ruby paketi kurulu olmalıdır.
Kod:
<% if @post.image.attached? %>
<%= image_tag @post.image.variant(resize_to_limit: [800, 800]) %>
<% end %>
Bu kod özgün dosyayı değiştirmez; istenen boyuta uygun bir türetilmiş görsel üretir. Görüntü işleme aracı kurulmamışsa varyant oluşturma aşamasında hata alabilirsiniz. Yalnızca dosyanın yüklenmesi gerekiyorsa varyant kullanmak zorunlu değildir.
Sonucu kontrol ederken hangi duruma bakılmalı?
| Görülen durum | Anlamı ve sonraki işlem |
|---|---|
| Kayıt başarılı, resim görünüyor | Form, güçlü parametreler, Active Storage tabloları ve görüntüleme kodu birlikte çalışıyor. |
| Kayıt başarılı, resim görünmüyor | attached? sonucunu kontrol edin. false ise parametre veya form sorunu; true ise depolama, URL veya görünüm tarafını inceleyin. |
| Kayıt başarısız | Model doğrulamalarındaki hata mesajlarını gösterin; dosya türü veya boyutu sınırı karşılanmıyor olabilir. |
| Varyant oluşturulurken hata | Görüntü işleme aracının ve Ruby paketinin kurulu, yapılandırılmış ve çalışabilir olduğunu kontrol edin. |
multipart/form-data gönderim biçiminin korunması gerekir. form_with dosya alanını modelle kullandığınızda Rails bunu uygun biçimde hazırlayabilir; özel HTML formu yazıyorsanız formun enctype değerini multipart/form-data yapmalısınız. Dosya parametresi sunucuya hiç ulaşmıyorsa denetleyicide params[:post] içeriğini geçici olarak inceleyebilirsiniz; tanılama bittikten sonra dosya adlarını, yollarını veya hassas bilgileri loglamamaya dikkat edin.Bu akışın en küçük çalışan özeti; Active Storage migration’larını çalıştırmak, modele
has_one_attached :image eklemek, formda file_field kullanmak, :image parametresine izin vermek ve görünümde attached? kontrolünden sonra image_tag çağırmaktır. Böylece resim modelle ilişkilendirilir ve seçtiğiniz depolama yapılandırmasına göre görüntülenebilir hale gelir.