R.Reddington

WFN Üye
Konular
627
Mesajlar
627
Çözüm
0
Ticaret Puanı
0
Üyelik
25 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Sosyal Backlink
1/1
Konu sahibi
Rails uygulamasında resim yüklemek için Active Storage'ı kurup modele bir dosya ilişkisi ekleyin; formdan seçilen dosyayı denetleyiciye gönderin ve kayıt sayfasında image_tag ile gösterin. Aşağıdaki örnek, her Photo kaydına tek resim bağlar ve geliştirme ortamında yerel disk kullanır.

Active Storage ve modeli hazırlayın​

Mevcut bir Rails uygulamasının kök dizininde aşağıdaki komutları çalıştırın. Örnek, uygulamada henüz Photo modeli olmadığını varsayar:

Kod:
bin/rails active_storage:install
bin/rails generate model Photo title:string
bin/rails db:migrate

İlk komut Active Storage tabloları için migration dosyasını oluşturur; son komut hem bu tabloları hem de photos tablosunu veritabanına uygular. Active Storage zaten kuruluysa ilk komutu yeniden çalıştırmayın. Model zaten varsa model oluşturma komutunu da atlayıp aşağıdaki ilişkiyi mevcut modele ekleyin.

app/models/photo.rb dosyasını düzenleyin:

Ruby:
class Photo < ApplicationRecord
  has_one_attached :image
end

has_one_attached, resim dosyasını kayıtla ilişkilendirir; photos tablosuna ayrıca bir resim sütunu eklemeniz gerekmez. Yerel deneme için config/environments/development.rb içinde Active Storage servisinin :local olduğundan ve config/storage.yml içinde bu servisin tanımlandığından emin olun.

Formu ve kayıt işlemini oluşturun​

config/routes.rb dosyasındaki mevcut Rails.application.routes.draw bloğunun içine şu satırı ekleyin:

Ruby:
resources :photos, only: [:new, :create, :show]

Ardından app/controllers/photos_controller.rb dosyasını oluşturun:

Ruby:
class PhotosController < ApplicationController
  def new
    @photo = Photo.new
  end

  def create
    @photo = Photo.new(photo_params)

    if @photo.save
      redirect_to @photo
    else
      render :new, status: :unprocessable_entity
    end
  end

  def show
    @photo = Photo.find(params[:id])
  end

  private

  def photo_params
    params.require(:photo).permit(:title, :image)
  end
end

permit(:title, :image), formdaki başlığın ve dosyanın kayda atanmasına izin verir. Kaydetme başarısız olursa form yeniden gösterilir. Şimdi app/views/photos/new.html.erb dosyasını oluşturun:

HTML:
<% if @photo.errors.any? %>
  <ul>
    <% @photo.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>

<%= form_with model: @photo, multipart: true 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/jpeg,image/png" %>
  </div>
  <%= form.submit "Kaydet" %>
<% end %>

multipart: true formun dosyayı gönderebilmesini sağlar. accept ise dosya seçicisine JPEG ve PNG önerir; sunucu tarafında güvenlik doğrulaması değildir.

Resmi gösterin ve yüklemeyi deneyin​

app/views/photos/show.html.erb dosyasını oluşturun:

HTML:
<h1><%= @photo.title %></h1>

<% if @photo.image.attached? %>
  <%= image_tag @photo.image, alt: @photo.title %>
<% else %>
  <p>Bu kayda resim eklenmemiş.</p>
<% end %>
  1. Uygulamayı bin/rails server ile başlatın ve tarayıcıda http://localhost:3000/photos/new adresini açın.
  2. Bir başlık yazıp JPEG veya PNG dosyası seçin ve Kaydet'e basın. Başarılı kayıtta yeni kaydın sayfasına yönlendirilir ve resmi görürsünüz. Dosya seçmeden gönderirseniz bu örnek kaydı yine oluşturur, ancak resim yerine açıklama gösterir.
Kayıt oluştuğu hâlde resim görünmüyorsa önce dosya seçildiğini, form alanının ve izin verilen parametrenin adının image olduğunu kontrol edin. Sunucu çıktısındaki hata, migration veya disk erişimi sorununu gösterebilir; yerel servis yapılandırmasını ve depolama dizinine yazma iznini de inceleyin. Sayfada resim görünmesi yalnızca o dosyanın o ortamda erişilebilir olduğunu gösterir; üretim ortamındaki depolamanın doğru yapılandırıldığını kanıtlamaz.

Yayına almadan önce​

Bu örnek temel yükleme akışını gösterir; herkese açık bir yükleme alanı için tek başına yeterli değildir. Sunucuda dosya boyutunu ve izin verilen türleri doğrulayın, içeriği güvenilir biçimde inceleyin ve yükleme yetkisini sınırlandırın. Yalnız dosya uzantısına, tarayıcı filtresine veya istemcinin bildirdiği içerik türüne güvenmeyin.

Üretimde seçtiğiniz Active Storage servisini ve kalıcı depolamayı ayrıca yapılandırın. Yerel diskin dağıtım veya yeniden başlatma sonrasında korunacağı varsayılmamalıdır. Özel resimler için de erişim yetkilendirmesini ayrıca tasarlayın; yalnızca resim bağlantısını gizlemek erişim kontrolü sağlamaz.
 
Moderatör tarafında düzenlendi:

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