R.Reddington

WFN Üye
Konular
562
Mesajlar
562
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Sosyal Backlink
1/1
Konu sahibi
İ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ı 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 durumAnlamı ve sonraki işlem
Kayıt başarılı, resim görünüyorForm, güçlü parametreler, Active Storage tabloları ve görüntüleme kodu birlikte çalışıyor.
Kayıt başarılı, resim görünmüyorattached? 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ızModel doğrulamalarındaki hata mesajlarını gösterin; dosya türü veya boyutu sınırı karşılanmıyor olabilir.
Varyant oluşturulurken hataGörüntü işleme aracının ve Ruby paketinin kurulu, yapılandırılmış ve çalışabilir olduğunu kontrol edin.
Dosya yükleme formunda özellikle 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic