- Implement search_by_name scope in City model - Add SearchController for handling search input - Include _search_city partial in cities index view - Update cities_controller to filter cities based on search query This commit introduces a new feature that allows users to search for cities by name using an input field. The search is implemented as a scope in the City model, and it is integrated into the existing CitiesController. A dedicated SearchController manages the input submission with a debouncing mechanism for better performance. The search field is rendered in the cities index view, enhancing user interactivity and experience.
71 lines
2.2 KiB
Ruby
71 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.includes(:countries).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)
|
|
end
|
|
|
|
@cities = @cities.page(params[:page]).per(12)
|
|
|
|
set_meta_tags(
|
|
title: @current_region ? "Cities in #{@current_region.name}" : "Explore Cities",
|
|
description: "Discover weather art for cities #{@current_region ? "in #{@current_region.name}" : 'worldwide'}. Real-time AI-generated weather visualization.",
|
|
keywords: "#{@current_region&.name}, cities, weather art, AI visualization"
|
|
)
|
|
end
|
|
|
|
def show
|
|
@city = City.friendly.find(params[:id])
|
|
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
|