otwarchive-symphonyarchive/app/controllers/challenges_controller.rb
2026-03-11 22:22:11 +00:00

68 lines
2.4 KiB
Ruby

class ChallengesController < ApplicationController
# This is the PARENT controller for all the challenge controller classes
#
# Here's how challenges work:
#
# For each TYPE of challenge, you use the challenge generator:
# script/generate challenge WhatEver -- eg, script/generate challenge
# Flashfic, script/generate challenge BigBang, etc
# This creates:
# - a model called Challenge::WhatEver -- eg, Challenge::Flashfic,
# Challenge::BigBang, etc which actually implements a challenge
# - a controller Challenge::WhatEverController --
# Challenge::FlashficController which goes in
# controllers/challenge/flashfic_controller.rb
# - a views subfolder called views/challenge/whatever --
# eg, views/challenge/flashfic/, views/challenge/bigbang/
#
# Example:
# script/generate challenge Flashfic creates:
# - controllers/challenge/flashfics_controller.rb
# - models/challenge/flashfic.rb
# - views/challenges/flashfics/
# - db/migrate/create_challenge_flashfics to create challenge_flashfics table
#
# Setting up an instance:
# - create the collection SGA_Flashfic
# - mark it as a challenge collection
# - choose "Regular Single Prompt (flashfic-style)" as the challenge type
#
# This feeds us into challenges/new and creates a new empty Challenge object
# with collection -> SGA_Flashfic
# and implementation -> Challenge::Flashfic.new
# We are then redirected to Challenge::FlashficController new ->
# views/challenges/flashfic/new.html.erb
#
# These can have lots of options specific to flashfics, including eg how often
# prompts are posted, if they should automatically
# be closed, whether we take user suggestions for prompts, etc.
#
before_action :load_collection
def no_collection
flash[:error] = t('challenge.no_collection',
default: 'What collection did you want to work with?')
redirect_to(request.env['HTTP_REFERER'] || root_path)
false
end
def no_challenge
flash[:error] = t('challenges.no_challenge',
default: 'What challenge did you want to work on?')
redirect_to collection_path(@collection) rescue redirect_to '/'
false
end
def load_collection
@collection ||= Collection.find_by(name: params[:collection_id]) if
params[:collection_id]
no_collection && return unless @collection
end
def load_challenge
@challenge = @collection.challenge
no_challenge and return unless @challenge
end
end