Compare commits
	
		
			2 Commits
		
	
	
		
			4b3bc58474
			...
			0cbd2e4fdc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0cbd2e4fdc | |||
| eca2e46d23 | 
@@ -8,6 +8,8 @@ class ContestsController < ApplicationController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def show
 | 
					  def show
 | 
				
			||||||
    @title = @contest.name
 | 
					    @title = @contest.name
 | 
				
			||||||
 | 
					    @puzzles = @contest.puzzles
 | 
				
			||||||
 | 
					    set_badges
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def edit
 | 
					  def edit
 | 
				
			||||||
@@ -42,6 +44,12 @@ class ContestsController < ApplicationController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def set_badges
 | 
				
			||||||
 | 
					    @badges = []
 | 
				
			||||||
 | 
					    @badges.push("team") if @contest.team
 | 
				
			||||||
 | 
					    @badges.push("registration") if @contest.allow_registration
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def set_contest
 | 
					  def set_contest
 | 
				
			||||||
    @contest = Contest.find(params[:id])
 | 
					    @contest = Contest.find(params[:id])
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
class PuzzlesController < ApplicationController
 | 
					class PuzzlesController < ApplicationController
 | 
				
			||||||
 | 
					  before_action :set_contest
 | 
				
			||||||
  before_action :set_puzzle, only: %i[ show destroy ]
 | 
					  before_action :set_puzzle, only: %i[ show destroy ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def index
 | 
					  def index
 | 
				
			||||||
@@ -10,13 +11,16 @@ class PuzzlesController < ApplicationController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def new
 | 
					  def new
 | 
				
			||||||
    @puzzle = Puzzle.new
 | 
					    @puzzle = Puzzle.new
 | 
				
			||||||
 | 
					    @title = "New contest puzzle"
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def create
 | 
					  def create
 | 
				
			||||||
    @puzzle = Puzzle.new(puzzle_params)
 | 
					    @puzzle = Puzzle.new(puzzle_params)
 | 
				
			||||||
 | 
					    @puzzle.contest_id = @contest.id
 | 
				
			||||||
    if @puzzle.save
 | 
					    if @puzzle.save
 | 
				
			||||||
      redirect_to @puzzle
 | 
					      redirect_to contest_path(@contest)
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
 | 
					      @title = "New contest puzzle"
 | 
				
			||||||
      render :new, status: :unprocessable_entity
 | 
					      render :new, status: :unprocessable_entity
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@@ -28,6 +32,10 @@ class PuzzlesController < ApplicationController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def set_contest
 | 
				
			||||||
 | 
					    @contest = Contest.find(params[:contest_id])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def set_puzzle
 | 
					  def set_puzzle
 | 
				
			||||||
    @puzzle = Puzzle.find(params[:id])
 | 
					    @puzzle = Puzzle.find(params[:id])
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
class Contest < ApplicationRecord
 | 
					class Contest < ApplicationRecord
 | 
				
			||||||
  belongs_to :user
 | 
					  belongs_to :user, dependent: :destroy
 | 
				
			||||||
 | 
					  has_many :puzzles
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
class Puzzle < ApplicationRecord
 | 
					class Puzzle < ApplicationRecord
 | 
				
			||||||
 | 
					  belongs_to :contest, dependent: :destroy
 | 
				
			||||||
  has_one_attached :image
 | 
					  has_one_attached :image
 | 
				
			||||||
  validates :name, presence: true
 | 
					  validates :name, presence: true
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,2 +1,31 @@
 | 
				
			|||||||
 | 
					.row.mb-2
 | 
				
			||||||
 | 
					  .col
 | 
				
			||||||
 | 
					    - @badges.each do |badge|
 | 
				
			||||||
 | 
					      span.badge.text-bg-info.me-2
 | 
				
			||||||
 | 
					        = badge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.row.mb-4
 | 
				
			||||||
 | 
					  .col
 | 
				
			||||||
    a.btn.btn-primary href=edit_contest_path(@contest)
 | 
					    a.btn.btn-primary href=edit_contest_path(@contest)
 | 
				
			||||||
 | 
					      | Edit contest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.row.mb-4
 | 
				
			||||||
 | 
					  .col
 | 
				
			||||||
 | 
					    h4 Puzzles
 | 
				
			||||||
 | 
					    .float-end
 | 
				
			||||||
 | 
					      a.btn.btn-primary href=new_contest_puzzle_path(@contest)
 | 
				
			||||||
 | 
					        | Add puzzle
 | 
				
			||||||
 | 
					    .row.row-cols-1.row-cols-md-3.g-4.mb-4
 | 
				
			||||||
 | 
					      - @puzzles.each do |puzzle|
 | 
				
			||||||
 | 
					        .col
 | 
				
			||||||
 | 
					          .card.h-100
 | 
				
			||||||
 | 
					            .card-header
 | 
				
			||||||
 | 
					              = puzzle.name
 | 
				
			||||||
 | 
					            = image_tag puzzle.image, class: "card-img-top" if puzzle.image.attached?
 | 
				
			||||||
 | 
					            .card-body
 | 
				
			||||||
 | 
					              p.card-text
 | 
				
			||||||
 | 
					                | TODO puzzle.brand
 | 
				
			||||||
 | 
					              a.btn.btn-primary href=edit_contest_puzzle_path(@contest, puzzle)
 | 
				
			||||||
                | Edit
 | 
					                | Edit
 | 
				
			||||||
 | 
					  .col
 | 
				
			||||||
 | 
					    h4 Teams
 | 
				
			||||||
							
								
								
									
										13
									
								
								app/views/puzzles/_form.html.slim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/views/puzzles/_form.html.slim
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					= form_with model: puzzle, url: "/contests/#{contest.id}/puzzles", method: :post do |form|
 | 
				
			||||||
 | 
					  .row.mb-3
 | 
				
			||||||
 | 
					    .col
 | 
				
			||||||
 | 
					      .form-floating
 | 
				
			||||||
 | 
					        = form.text_field :name, autocomplete: "off", class: "form-control"
 | 
				
			||||||
 | 
					        = form.label :name, class: "required"
 | 
				
			||||||
 | 
					  .row.mb-3
 | 
				
			||||||
 | 
					    .col
 | 
				
			||||||
 | 
					      .form-text Select an image
 | 
				
			||||||
 | 
					      = form.file_field :image, accept: "image/*", class: "form-control"
 | 
				
			||||||
 | 
					  .row
 | 
				
			||||||
 | 
					    .col
 | 
				
			||||||
 | 
					      = form.submit submit_text, class: "btn btn-primary"
 | 
				
			||||||
@@ -1,11 +1 @@
 | 
				
			|||||||
h1 New puzzle
 | 
					= render "form", contest: @contest, puzzle: @puzzle, submit_text: "Add"
 | 
				
			||||||
 | 
					 | 
				
			||||||
= form_with model: @puzzle do |form|
 | 
					 | 
				
			||||||
  div
 | 
					 | 
				
			||||||
    = form.label :name
 | 
					 | 
				
			||||||
    = form.text_field :name
 | 
					 | 
				
			||||||
  div
 | 
					 | 
				
			||||||
    = form.label :image, style: "display: block"
 | 
					 | 
				
			||||||
    = form.file_field :image, accept: "image/*"
 | 
					 | 
				
			||||||
  div
 | 
					 | 
				
			||||||
    = form.submit
 | 
					 | 
				
			||||||
@@ -8,9 +8,10 @@ Rails.application.routes.draw do
 | 
				
			|||||||
  # Defines the root path route ("/")
 | 
					  # Defines the root path route ("/")
 | 
				
			||||||
  root "contests#index"
 | 
					  root "contests#index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  resources :contests
 | 
					  resources :contests do
 | 
				
			||||||
  resources :passwords, param: :token
 | 
					 | 
				
			||||||
    resources :puzzles
 | 
					    resources :puzzles
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  resources :passwords, param: :token
 | 
				
			||||||
  resource :session
 | 
					  resource :session
 | 
				
			||||||
  resources :users
 | 
					  resources :users
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								db/migrate/20250315124339_add_contest_ref_to_puzzle.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								db/migrate/20250315124339_add_contest_ref_to_puzzle.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					class AddContestRefToPuzzle < ActiveRecord::Migration[8.0]
 | 
				
			||||||
 | 
					  def change
 | 
				
			||||||
 | 
					    add_reference :puzzles, :contest, null: false, foreign_key: true
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										5
									
								
								db/schema.rb
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								db/schema.rb
									
									
									
										generated
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# It's strongly recommended that you check this file into your version control system.
 | 
					# It's strongly recommended that you check this file into your version control system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ActiveRecord::Schema[8.0].define(version: 2025_03_15_114657) do
 | 
					ActiveRecord::Schema[8.0].define(version: 2025_03_15_124339) do
 | 
				
			||||||
  create_table "active_storage_attachments", force: :cascade do |t|
 | 
					  create_table "active_storage_attachments", force: :cascade do |t|
 | 
				
			||||||
    t.string "name", null: false
 | 
					    t.string "name", null: false
 | 
				
			||||||
    t.string "record_type", null: false
 | 
					    t.string "record_type", null: false
 | 
				
			||||||
@@ -53,6 +53,8 @@ ActiveRecord::Schema[8.0].define(version: 2025_03_15_114657) do
 | 
				
			|||||||
    t.string "name"
 | 
					    t.string "name"
 | 
				
			||||||
    t.datetime "created_at", null: false
 | 
					    t.datetime "created_at", null: false
 | 
				
			||||||
    t.datetime "updated_at", null: false
 | 
					    t.datetime "updated_at", null: false
 | 
				
			||||||
 | 
					    t.integer "contest_id", null: false
 | 
				
			||||||
 | 
					    t.index ["contest_id"], name: "index_puzzles_on_contest_id"
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  create_table "sessions", force: :cascade do |t|
 | 
					  create_table "sessions", force: :cascade do |t|
 | 
				
			||||||
@@ -76,5 +78,6 @@ ActiveRecord::Schema[8.0].define(version: 2025_03_15_114657) do
 | 
				
			|||||||
  add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
 | 
					  add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
 | 
				
			||||||
  add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
 | 
					  add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
 | 
				
			||||||
  add_foreign_key "contests", "users"
 | 
					  add_foreign_key "contests", "users"
 | 
				
			||||||
 | 
					  add_foreign_key "puzzles", "contests"
 | 
				
			||||||
  add_foreign_key "sessions", "users"
 | 
					  add_foreign_key "sessions", "users"
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user