diff --git a/app/controllers/api/v1/events_controller.rb b/app/controllers/api/v1/events_controller.rb
index 2a9398c..f57db19 100755
--- a/app/controllers/api/v1/events_controller.rb
+++ b/app/controllers/api/v1/events_controller.rb
@@ -88,6 +88,7 @@ module Api
latitude: event.latitude,
longitude: event.longitude,
featured: event.featured,
+ image_url: event.display_image_url,
created_at: event.created_at,
updated_at: event.updated_at,
user: {
diff --git a/app/controllers/promoter/events_controller.rb b/app/controllers/promoter/events_controller.rb
index 72af78d..e86b8bb 100644
--- a/app/controllers/promoter/events_controller.rb
+++ b/app/controllers/promoter/events_controller.rb
@@ -45,6 +45,8 @@ class Promoter::EventsController < ApplicationController
if @event.update(event_params)
redirect_to promoter_event_path(@event), notice: "Event mis à jour avec succès!"
else
+ # If validation fails and a new image was attached, purge it
+ @event.image.purge if @event.image.attached? && @event.changed.include?('image')
render :edit, status: :unprocessable_entity
end
end
diff --git a/app/models/event.rb b/app/models/event.rb
index 5038539..d4be2c9 100755
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -27,6 +27,7 @@ class Event < ApplicationRecord
# === Callbacks ===
before_validation :geocode_address, if: :should_geocode_address?
+ before_update :handle_image_replacement, if: :image_attached?
# Validations for Event attributes
# Basic information
@@ -61,8 +62,26 @@ class Event < ApplicationRecord
# === Instance Methods ===
+ # Get image URL prioritizing old image field if it exists
+ def display_image_url
+ # First check if old image field exists and has a value
+ return self[:image] if self[:image].present?
+
+ # Fall back to attached image
+ return nil unless image.attached?
+
+ # Return the URL for the attached image
+ Rails.application.routes.url_helpers.rails_blob_url(image, only_path: true)
+ end
+
# Get image variants for different display sizes
def event_image_variant(size = :medium)
+ # For old image field, return the URL directly
+ return self[:image] if self[:image].present?
+
+ # For attached images, process variants
+ return nil unless image.attached?
+
case size
when :large
image.variant(resize_to_limit: [1200, 630])
@@ -75,6 +94,11 @@ class Event < ApplicationRecord
end
end
+ # Check if event has any image (old field or attached)
+ def has_image?
+ self[:image].present? || image.attached?
+ end
+
# Check if coordinates were successfully geocoded or are fallback coordinates
def geocoding_successful?
coordinates_look_valid?
@@ -169,6 +193,19 @@ class Event < ApplicationRecord
private
+ # Check if image is attached for the callback
+ def image_attached?
+ image.attached?
+ end
+
+ # Handle image replacement when a new image is uploaded
+ def handle_image_replacement
+ # Clear the old image field if a new image is being attached
+ if image.attached?
+ self[:image] = nil
+ end
+ end
+
# Determine if we should perform server-side geocoding
def should_geocode_address?
# Don't geocode if address is blank
diff --git a/app/views/components/_event_item.html.erb b/app/views/components/_event_item.html.erb
index 4fa25f1..3ae2a3f 100755
--- a/app/views/components/_event_item.html.erb
+++ b/app/views/components/_event_item.html.erb
@@ -1,7 +1,7 @@
<%= link_to event_path(event.slug, event), class: "group block p-4 rounded-lg border border-slate-200 dark:border-slate-700 hover:border-purple-300 dark:hover:border-purple-600 hover:shadow-md transition-all duration-200" do %>