- Implement MapController for displaying city maps - Add map rendering in the city show view - Include weather arts in the city show controller - Update asset pipeline to include Leaflet CSS and JS This commit introduces a map feature that allows users to view geographical information related to cities. The map is integrated with weather arts data, enhancing the overall functionality of the city show page.
76 lines
2.2 KiB
Ruby
76 lines
2.2 KiB
Ruby
class CitiesController < ApplicationController
|
|
before_action :authenticate_user!, only: [ :generate_weather_art ]
|
|
before_action :require_admin, only: [ :generate_weather_art ]
|
|
|
|
def index
|
|
@regions = Region.order(:name)
|
|
@cities = City.includes(:country, country: :region).order(:name)
|
|
|
|
if params[:query].present?
|
|
@cities = @cities.search_by_name(params[:query])
|
|
end
|
|
|
|
if params[:region]
|
|
@current_region = Region.friendly.find(params[:region])
|
|
@cities = @cities.by_region(@current_region.id) if @current_region
|
|
end
|
|
|
|
if params[:country]
|
|
@current_country = Country.friendly.find(params[:country])
|
|
@cities = @cities.by_country(@current_country.id) if @current_country
|
|
end
|
|
|
|
@cities = @cities.page(params[:page]).per(12)
|
|
|
|
respond_to do |format|
|
|
format.html
|
|
format.turbo_stream {
|
|
render turbo_stream: turbo_stream.update("cities_results",
|
|
partial: "cities/results",
|
|
locals: { cities: @cities }
|
|
)
|
|
}
|
|
end
|
|
end
|
|
|
|
def show
|
|
@city = City.friendly.find(params[:id])
|
|
@arts = @city.weather_arts.order(weather_date: :desc).includes([ :image_attachment ])
|
|
ahoy.track "View City", {
|
|
city_id: @city.id,
|
|
name: @city.name,
|
|
event_type: "city_view"
|
|
}
|
|
|
|
set_meta_tags(
|
|
title: @city.name,
|
|
description: "Experience #{@city.name}'s weather through AI-generated art. Daily updates of weather conditions visualized through artificial intelligence.",
|
|
keywords: "#{@city.name}, #{@city.country.name}, weather art, AI visualization",
|
|
og: {
|
|
image: @city.latest_weather_art&.image&.attached? ? url_for(@city.latest_weather_art.image) : nil
|
|
}
|
|
)
|
|
end
|
|
|
|
def generate_weather_art
|
|
@city = City.friendly.find(params[:id])
|
|
GenerateWeatherArtWorker.perform_async(@city.id)
|
|
|
|
respond_to do |format|
|
|
format.html do
|
|
flash[:notice] = "Weather art generation has been queued"
|
|
redirect_to @city
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def require_admin
|
|
unless current_user&.admin?
|
|
flash[:error] = "You are not authorized to perform this action"
|
|
redirect_to root_path
|
|
end
|
|
end
|
|
end
|