Add offline model and "new" form/controller
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
class ContestsController < ApplicationController
|
||||
before_action :set_contest, only: %i[ destroy edit show update ]
|
||||
skip_before_action :require_authentication, only: %i[ scoreboard ]
|
||||
skip_before_action :require_authentication, only: %i[ scoreboard offline_new ]
|
||||
|
||||
def index
|
||||
authorize :contest
|
||||
@@ -99,6 +99,21 @@ class ContestsController < ApplicationController
|
||||
render :scoreboard
|
||||
end
|
||||
|
||||
def offline_new
|
||||
@contest = Contest.find_by(slug: params[:id])
|
||||
unless @contest && @contest.public
|
||||
skip_authorization
|
||||
not_found and return
|
||||
end
|
||||
authorize :contest
|
||||
|
||||
I18n.locale = @contest.lang
|
||||
|
||||
@title = I18n.t("contests.scoreboard.title", name: @contest.name)
|
||||
|
||||
@offline = Offline.new
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_badges
|
||||
|
||||
@@ -31,6 +31,7 @@ class Contest < ApplicationRecord
|
||||
has_many :contestants, dependent: :destroy
|
||||
has_many :puzzles, dependent: :destroy
|
||||
has_many :messages, dependent: :destroy
|
||||
has_many :offlines, dependent: :destroy
|
||||
|
||||
friendly_id :name, use: :slugged
|
||||
|
||||
|
||||
27
app/models/offline.rb
Normal file
27
app/models/offline.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: offlines
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# end_time :datetime
|
||||
# start_time :datetime not null
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# contest_id :integer not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_offlines_on_contest_id (contest_id)
|
||||
#
|
||||
# Foreign Keys
|
||||
#
|
||||
# contest_id (contest_id => contests.id)
|
||||
#
|
||||
class Offline < ApplicationRecord
|
||||
belongs_to :contest
|
||||
|
||||
has_one_attached :start_image
|
||||
has_one_attached :end_image
|
||||
|
||||
validates :start_time, presence: true
|
||||
end
|
||||
@@ -47,6 +47,22 @@ class ContestPolicy < ApplicationPolicy
|
||||
record.user.id == user.id || user.admin?
|
||||
end
|
||||
|
||||
def offline_new?
|
||||
true
|
||||
end
|
||||
|
||||
def offline_create?
|
||||
true
|
||||
end
|
||||
|
||||
def offline_edit?
|
||||
true
|
||||
end
|
||||
|
||||
def offline_update?
|
||||
true
|
||||
end
|
||||
|
||||
def scoreboard?
|
||||
true
|
||||
end
|
||||
|
||||
25
app/views/contests/offline_new.html.slim
Normal file
25
app/views/contests/offline_new.html.slim
Normal file
@@ -0,0 +1,25 @@
|
||||
= form_with model: @offline, url: "/public/#{@contest.id}/offline" do |form|
|
||||
.row.mb-3
|
||||
.col
|
||||
.form-text.mb-1
|
||||
= t("puzzles.image_select")
|
||||
= form.file_field :start_image, accept: "image/*", class: "form-control"
|
||||
.form-text.error-message style="display: none;" id="image-error-message"
|
||||
= t("puzzles.form.file_too_big")
|
||||
javascript:
|
||||
function setMaxUploadSize() {
|
||||
const el = document.querySelector('input[type="file"]');
|
||||
el.onchange = function() {
|
||||
if(this.files[0].size > 2 * 1024 * 1024) {
|
||||
document.getElementById('image-error-message').style.display = 'block';
|
||||
this.value = "";
|
||||
} else {
|
||||
document.getElementById('image-error-message').style.display = 'none';
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
setMaxUploadSize();
|
||||
.row.mt-3
|
||||
.col
|
||||
= form.submit t("helpers.buttons.add"), class: "btn btn-primary"
|
||||
Reference in New Issue
Block a user