diff --git a/Gemfile.lock b/Gemfile.lock
index d2e7d12..66383c9 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,9 +1,9 @@
PATH
remote: .
specs:
- administrate-field-active_storage (0.3.8)
+ administrate-field-active_storage (0.4.1)
administrate (>= 0.2.2)
- rails (>= 6.0)
+ rails (>= 7.0)
GEM
remote: https://rubygems.org/
@@ -67,26 +67,23 @@ GEM
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
- administrate (0.16.0)
+ administrate (0.19.0)
actionpack (>= 5.0)
actionview (>= 5.0)
activerecord (>= 5.0)
- datetime_picker_rails (~> 0.0.7)
jquery-rails (>= 4.0)
kaminari (>= 1.0)
- momentjs-rails (~> 2.8)
sassc-rails (~> 2.1)
selectize-rails (~> 0.6)
ast (2.4.2)
builder (3.2.4)
concurrent-ruby (1.1.9)
crass (1.0.6)
- datetime_picker_rails (0.0.7)
- momentjs-rails (>= 2.8.1)
+ date (3.3.4)
erubi (1.10.0)
- ffi (1.15.4)
- globalid (1.0.0)
- activesupport (>= 5.0)
+ ffi (1.16.3)
+ globalid (1.2.1)
+ activesupport (>= 6.1)
highline (2.0.3)
i18n (1.8.11)
concurrent-ruby (~> 1.0)
@@ -100,7 +97,7 @@ GEM
rails-i18n
rainbow (>= 2.2.2, < 4.0)
terminal-table (>= 1.5.1)
- jquery-rails (4.4.0)
+ jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
@@ -119,18 +116,28 @@ GEM
loofah (2.13.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
- mail (2.7.1)
+ mail (2.8.1)
mini_mime (>= 0.1.1)
+ net-imap
+ net-pop
+ net-smtp
marcel (1.0.2)
method_source (1.0.0)
- mini_mime (1.1.2)
+ mini_mime (1.1.5)
+ mini_portile2 (2.8.5)
minitest (5.15.0)
- momentjs-rails (2.29.1)
- railties (>= 3.1)
- nio4r (2.5.8)
- nokogiri (1.13.3-x86_64-darwin)
- racc (~> 1.4)
- nokogiri (1.13.3-x86_64-linux)
+ net-imap (0.4.5)
+ date
+ net-protocol
+ net-pop (0.1.2)
+ net-protocol
+ net-protocol (0.2.2)
+ timeout
+ net-smtp (0.4.0)
+ net-protocol
+ nio4r (2.6.0)
+ nokogiri (1.13.3)
+ mini_portile2 (~> 2.8.0)
racc (~> 1.4)
parser (3.0.3.2)
ast (~> 2.4.1)
@@ -178,7 +185,7 @@ GEM
sprockets-rails
tilt
selectize-rails (0.12.6)
- sprockets (4.0.2)
+ sprockets (4.1.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.4.2)
@@ -189,16 +196,18 @@ GEM
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
thor (1.1.0)
- tilt (2.0.10)
+ tilt (2.3.0)
+ timeout (0.4.1)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
unicode-display_width (2.1.0)
- websocket-driver (0.7.5)
+ websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
zeitwerk (2.5.2)
PLATFORMS
+ arm64-darwin-21
x86_64-darwin-20
x86_64-linux
diff --git a/app/views/fields/active_storage/_item.html.erb b/app/views/fields/active_storage/_item.html.erb
index 31837c7..5565468 100644
--- a/app/views/fields/active_storage/_item.html.erb
+++ b/app/views/fields/active_storage/_item.html.erb
@@ -23,15 +23,17 @@ controlled via a boolean local variable.
[x, y]
Maximum size of the ActiveStorage preview.
%>
-<% if field.show_display_preview? %>
+<% if field.show_display_preview? && attachment.persisted? %>
<%= render partial: 'fields/active_storage/preview', locals: local_assigns %>
<% end %>
-
- <%= link_to attachment.filename, field.blob_url(attachment), title: attachment.filename %>
-
+<% if attachment.persisted? %>
+
+ <%= link_to attachment.filename, field.blob_url(attachment), title: attachment.filename %>
+
+<% end %>
<% if field.destroy_url.present? %>
<% destroy_url = field.destroy_url.call(namespace, field.data.record, attachment) %>
diff --git a/contribute.md b/contribute.md
index d6cd384..9dd521a 100644
--- a/contribute.md
+++ b/contribute.md
@@ -14,3 +14,4 @@
- Jazzy Gasper [@jazzygasper](https://github.com/jazzygasper)
- David Ma [@taikon](https://github.com/taikon)
- Dmitry Davydov [@haukot](https://github.com/haukot)
+- Jeanine Soterwood [@littleforest](https://github.com/littleforest)
diff --git a/test_app/Gemfile b/test_app/Gemfile
index c336418..156af8a 100644
--- a/test_app/Gemfile
+++ b/test_app/Gemfile
@@ -4,7 +4,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '3.0.3'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
-gem 'rails'
+gem 'rails', '7.1.2'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.4'
# Use Puma as the app server
@@ -15,7 +15,7 @@ gem 'sass-rails', '>= 6'
# gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
-# gem 'image_processing', '~> 1.2'
+gem 'image_processing', '~> 1.2'
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
diff --git a/test_app/Gemfile.lock b/test_app/Gemfile.lock
index 139ebc8..3468a24 100644
--- a/test_app/Gemfile.lock
+++ b/test_app/Gemfile.lock
@@ -8,64 +8,79 @@ PATH
GEM
remote: https://rubygems.org/
specs:
- actioncable (7.0.0)
- actionpack (= 7.0.0)
- activesupport (= 7.0.0)
+ actioncable (7.1.2)
+ actionpack (= 7.1.2)
+ activesupport (= 7.1.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (7.0.0)
- actionpack (= 7.0.0)
- activejob (= 7.0.0)
- activerecord (= 7.0.0)
- activestorage (= 7.0.0)
- activesupport (= 7.0.0)
+ zeitwerk (~> 2.6)
+ actionmailbox (7.1.2)
+ actionpack (= 7.1.2)
+ activejob (= 7.1.2)
+ activerecord (= 7.1.2)
+ activestorage (= 7.1.2)
+ activesupport (= 7.1.2)
mail (>= 2.7.1)
- actionmailer (7.0.0)
- actionpack (= 7.0.0)
- actionview (= 7.0.0)
- activejob (= 7.0.0)
- activesupport (= 7.0.0)
+ net-imap
+ net-pop
+ net-smtp
+ actionmailer (7.1.2)
+ actionpack (= 7.1.2)
+ actionview (= 7.1.2)
+ activejob (= 7.1.2)
+ activesupport (= 7.1.2)
mail (~> 2.5, >= 2.5.4)
- rails-dom-testing (~> 2.0)
- actionpack (7.0.0)
- actionview (= 7.0.0)
- activesupport (= 7.0.0)
- rack (~> 2.0, >= 2.2.0)
+ net-imap
+ net-pop
+ net-smtp
+ rails-dom-testing (~> 2.2)
+ actionpack (7.1.2)
+ actionview (= 7.1.2)
+ activesupport (= 7.1.2)
+ nokogiri (>= 1.8.5)
+ racc
+ rack (>= 2.2.4)
+ rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (7.0.0)
- actionpack (= 7.0.0)
- activerecord (= 7.0.0)
- activestorage (= 7.0.0)
- activesupport (= 7.0.0)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ actiontext (7.1.2)
+ actionpack (= 7.1.2)
+ activerecord (= 7.1.2)
+ activestorage (= 7.1.2)
+ activesupport (= 7.1.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (7.0.0)
- activesupport (= 7.0.0)
+ actionview (7.1.2)
+ activesupport (= 7.1.2)
builder (~> 3.1)
- erubi (~> 1.4)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (7.0.0)
- activesupport (= 7.0.0)
+ erubi (~> 1.11)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ activejob (7.1.2)
+ activesupport (= 7.1.2)
globalid (>= 0.3.6)
- activemodel (7.0.0)
- activesupport (= 7.0.0)
- activerecord (7.0.0)
- activemodel (= 7.0.0)
- activesupport (= 7.0.0)
- activestorage (7.0.0)
- actionpack (= 7.0.0)
- activejob (= 7.0.0)
- activerecord (= 7.0.0)
- activesupport (= 7.0.0)
+ activemodel (7.1.2)
+ activesupport (= 7.1.2)
+ activerecord (7.1.2)
+ activemodel (= 7.1.2)
+ activesupport (= 7.1.2)
+ timeout (>= 0.4.0)
+ activestorage (7.1.2)
+ actionpack (= 7.1.2)
+ activejob (= 7.1.2)
+ activerecord (= 7.1.2)
+ activesupport (= 7.1.2)
marcel (~> 1.0)
- mini_mime (>= 1.1.0)
- activesupport (7.0.0)
+ activesupport (7.1.2)
+ base64
+ bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
+ connection_pool (>= 2.2.5)
+ drb
i18n (>= 1.6, < 2)
minitest (>= 5.1)
+ mutex_m
tzinfo (~> 2.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
@@ -79,6 +94,8 @@ GEM
momentjs-rails (~> 2.8)
sassc-rails (~> 2.1)
selectize-rails (~> 0.6)
+ base64 (0.2.0)
+ bigdecimal (3.1.4)
bindex (0.8.1)
builder (3.2.4)
byebug (11.1.3)
@@ -92,16 +109,27 @@ GEM
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
childprocess (4.1.0)
- concurrent-ruby (1.1.9)
+ concurrent-ruby (1.2.2)
+ connection_pool (2.4.1)
crass (1.0.6)
+ date (3.3.4)
datetime_picker_rails (0.0.7)
momentjs-rails (>= 2.8.1)
- erubi (1.10.0)
+ drb (2.2.0)
+ ruby2_keywords
+ erubi (1.12.0)
ffi (1.15.4)
- globalid (1.0.0)
- activesupport (>= 5.0)
- i18n (1.8.11)
+ globalid (1.2.1)
+ activesupport (>= 6.1)
+ i18n (1.14.1)
concurrent-ruby (~> 1.0)
+ image_processing (1.12.2)
+ mini_magick (>= 4.9.5, < 5)
+ ruby-vips (>= 2.0.17, < 3)
+ io-console (0.6.0)
+ irb (1.9.0)
+ rdoc
+ reline (>= 0.3.8)
jquery-rails (4.4.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
@@ -118,61 +146,93 @@ GEM
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
- loofah (2.13.0)
+ loofah (2.22.0)
crass (~> 1.0.2)
- nokogiri (>= 1.5.9)
- mail (2.7.1)
+ nokogiri (>= 1.12.0)
+ mail (2.8.1)
mini_mime (>= 0.1.1)
+ net-imap
+ net-pop
+ net-smtp
marcel (1.0.2)
matrix (0.4.2)
- method_source (1.0.0)
- mini_mime (1.1.2)
- minitest (5.15.0)
+ mini_magick (4.12.0)
+ mini_mime (1.1.5)
+ minitest (5.20.0)
momentjs-rails (2.29.1)
railties (>= 3.1)
- nio4r (2.5.8)
- nokogiri (1.13.3-x86_64-darwin)
+ mutex_m (0.2.0)
+ net-imap (0.4.5)
+ date
+ net-protocol
+ net-pop (0.1.2)
+ net-protocol
+ net-protocol (0.2.2)
+ timeout
+ net-smtp (0.4.0)
+ net-protocol
+ nio4r (2.6.0)
+ nokogiri (1.15.5-arm64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.15.5-x86_64-darwin)
racc (~> 1.4)
- nokogiri (1.13.3-x86_64-linux)
+ nokogiri (1.15.5-x86_64-linux)
racc (~> 1.4)
+ psych (5.1.1.1)
+ stringio
public_suffix (4.0.6)
puma (5.6.4)
nio4r (~> 2.0)
- racc (1.6.0)
- rack (2.2.3)
+ racc (1.7.3)
+ rack (2.2.8)
rack-mini-profiler (2.3.3)
rack (>= 1.2.0)
- rack-test (1.1.0)
- rack (>= 1.0, < 3)
- rails (7.0.0)
- actioncable (= 7.0.0)
- actionmailbox (= 7.0.0)
- actionmailer (= 7.0.0)
- actionpack (= 7.0.0)
- actiontext (= 7.0.0)
- actionview (= 7.0.0)
- activejob (= 7.0.0)
- activemodel (= 7.0.0)
- activerecord (= 7.0.0)
- activestorage (= 7.0.0)
- activesupport (= 7.0.0)
+ rack-session (1.0.1)
+ rack (< 3)
+ rack-test (2.1.0)
+ rack (>= 1.3)
+ rackup (1.0.0)
+ rack (< 3)
+ webrick
+ rails (7.1.2)
+ actioncable (= 7.1.2)
+ actionmailbox (= 7.1.2)
+ actionmailer (= 7.1.2)
+ actionpack (= 7.1.2)
+ actiontext (= 7.1.2)
+ actionview (= 7.1.2)
+ activejob (= 7.1.2)
+ activemodel (= 7.1.2)
+ activerecord (= 7.1.2)
+ activestorage (= 7.1.2)
+ activesupport (= 7.1.2)
bundler (>= 1.15.0)
- railties (= 7.0.0)
- rails-dom-testing (2.0.3)
- activesupport (>= 4.2.0)
+ railties (= 7.1.2)
+ rails-dom-testing (2.2.0)
+ activesupport (>= 5.0.0)
+ minitest
nokogiri (>= 1.6)
- rails-html-sanitizer (1.4.2)
- loofah (~> 2.3)
- railties (7.0.0)
- actionpack (= 7.0.0)
- activesupport (= 7.0.0)
- method_source
+ rails-html-sanitizer (1.6.0)
+ loofah (~> 2.21)
+ nokogiri (~> 1.14)
+ railties (7.1.2)
+ actionpack (= 7.1.2)
+ activesupport (= 7.1.2)
+ irb
+ rackup (>= 1.0.0)
rake (>= 12.2)
- thor (~> 1.0)
- zeitwerk (~> 2.5)
- rake (13.0.6)
+ thor (~> 1.0, >= 1.2.2)
+ zeitwerk (~> 2.6)
+ rake (13.1.0)
+ rdoc (6.6.0)
+ psych (>= 4.0.0)
regexp_parser (2.2.0)
+ reline (0.4.0)
+ io-console (~> 0.5)
rexml (3.2.5)
+ ruby-vips (2.2.0)
+ ffi (~> 1.12)
+ ruby2_keywords (0.0.5)
rubyzip (2.3.2)
sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1)
@@ -197,23 +257,27 @@ GEM
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.4.2)
- thor (1.1.0)
+ stringio (3.0.9)
+ thor (1.3.0)
tilt (2.0.10)
- tzinfo (2.0.4)
+ timeout (0.4.1)
+ tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
web-console (4.2.0)
actionview (>= 6.0.0)
activemodel (>= 6.0.0)
bindex (>= 0.4.0)
railties (>= 6.0.0)
- websocket-driver (0.7.5)
+ webrick (1.8.1)
+ websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.5.2)
+ zeitwerk (2.6.12)
PLATFORMS
+ arm64-darwin-23
x86_64-darwin-20
x86_64-darwin-21
x86_64-linux
@@ -223,9 +287,10 @@ DEPENDENCIES
administrate-field-active_storage!
byebug
capybara (>= 3.26)
+ image_processing (~> 1.2)
puma (~> 5.6)
rack-mini-profiler (~> 2.0)
- rails
+ rails (= 7.1.2)
sass-rails (>= 6)
selenium-webdriver
sqlite3 (~> 1.4)
@@ -236,4 +301,4 @@ RUBY VERSION
ruby 3.0.3p157
BUNDLED WITH
- 2.2.33
+ 2.4.22
diff --git a/test_app/app/dashboards/post_dashboard.rb b/test_app/app/dashboards/post_dashboard.rb
index 9e57ea0..0c5fb5c 100644
--- a/test_app/app/dashboards/post_dashboard.rb
+++ b/test_app/app/dashboards/post_dashboard.rb
@@ -10,6 +10,7 @@ class PostDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
id: Field::Number,
cover_image: Field::ActiveStorage,
+ title: Field::String,
created_at: Field::DateTime,
updated_at: Field::DateTime,
}.freeze
@@ -21,6 +22,7 @@ class PostDashboard < Administrate::BaseDashboard
# Feel free to add, remove, or rearrange items.
COLLECTION_ATTRIBUTES = %i[
id
+ title
cover_image
created_at
].freeze
@@ -29,6 +31,7 @@ class PostDashboard < Administrate::BaseDashboard
# an array of attributes that will be displayed on the model's show page.
SHOW_PAGE_ATTRIBUTES = %i[
id
+ title
cover_image
created_at
updated_at
@@ -38,6 +41,7 @@ class PostDashboard < Administrate::BaseDashboard
# an array of attributes that will be displayed
# on the model's form (`new` and `edit`) pages.
FORM_ATTRIBUTES = %i[
+ title
cover_image
].freeze
diff --git a/test_app/app/models/post.rb b/test_app/app/models/post.rb
index 9d9e6a6..4bf7955 100644
--- a/test_app/app/models/post.rb
+++ b/test_app/app/models/post.rb
@@ -1,3 +1,5 @@
class Post < ApplicationRecord
has_one_attached :cover_image
+
+ validates :title, presence: true
end
diff --git a/test_app/bin/setup b/test_app/bin/setup
index 5792302..eee68ea 100755
--- a/test_app/bin/setup
+++ b/test_app/bin/setup
@@ -5,7 +5,7 @@ require "fileutils"
APP_ROOT = File.expand_path('..', __dir__)
def system!(*args)
- system(*args) || abort("\n== Command #{args} failed ==")
+ system(*args, exception: true)
end
FileUtils.chdir APP_ROOT do
diff --git a/test_app/config/application.rb b/test_app/config/application.rb
index 0ff221c..5d66996 100644
--- a/test_app/config/application.rb
+++ b/test_app/config/application.rb
@@ -12,7 +12,6 @@
require "action_text/engine"
require "action_view/railtie"
# require "action_cable/engine"
-require "sprockets/railtie"
require "rails/test_unit/railtie"
# Require the gems listed in Gemfile, including any gems
@@ -22,7 +21,12 @@
module TestApp
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
- config.load_defaults 6.1
+ config.load_defaults 7.1
+
+ # Please, add to the `ignore` list any other `lib` subdirectories that do
+ # not contain `.rb` files, or that should not be reloaded or eager loaded.
+ # Common ones are `templates`, `generators`, or `middleware`, for example.
+ config.autoload_lib(ignore: %w(assets tasks))
# Configuration for the application, engines, and railties goes here.
#
diff --git a/test_app/config/environments/development.rb b/test_app/config/environments/development.rb
index d533da7..37b45dd 100644
--- a/test_app/config/environments/development.rb
+++ b/test_app/config/environments/development.rb
@@ -6,7 +6,7 @@
# In the development environment your application's code is reloaded any time
# it changes. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
- config.cache_classes = false
+ config.enable_reloading = true
# Do not eager load code on boot.
config.eager_load = false
@@ -14,9 +14,12 @@
# Show full error reports.
config.consider_all_requests_local = true
+ # Enable server timing
+ config.server_timing = true
+
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
- if Rails.root.join('tmp', 'caching-dev.txt').exist?
+ if Rails.root.join("tmp/caching-dev.txt").exist?
config.action_controller.perform_caching = true
config.action_controller.enable_fragment_cache_logging = true
@@ -48,10 +51,8 @@
# Highlight code that triggered database queries in logs.
config.active_record.verbose_query_logs = true
- # Debug mode disables concatenation and preprocessing of assets.
- # This option may cause significant delays in view rendering with a large
- # number of complex assets.
- config.assets.debug = true
+ # Highlight code that enqueued background job in logs.
+ config.active_job.verbose_enqueue_logs = true
# Suppress logger output for asset requests.
config.assets.quiet = true
@@ -62,10 +63,6 @@
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
- # Use an evented file watcher to asynchronously detect changes in source code,
- # routes, locales, etc. This feature depends on the listen gem.
- # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
-
- # Uncomment if you wish to allow Action Cable access from any origin.
- # config.action_cable.disable_request_forgery_protection = true
+ # Raise error when a before_action's only/except options reference missing actions
+ config.action_controller.raise_on_missing_callback_actions = true
end
diff --git a/test_app/config/environments/production.rb b/test_app/config/environments/production.rb
index 6c659c4..e1adf64 100644
--- a/test_app/config/environments/production.rb
+++ b/test_app/config/environments/production.rb
@@ -4,7 +4,7 @@
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
- config.cache_classes = true
+ config.enable_reloading = false
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
@@ -13,16 +13,15 @@
config.eager_load = true
# Full error reports are disabled and caching is turned on.
- config.consider_all_requests_local = false
+ config.consider_all_requests_local = false
config.action_controller.perform_caching = true
- # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
- # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
+ # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment
+ # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files).
# config.require_master_key = true
- # Disable serving static files from the `/public` folder by default since
- # Apache or NGINX already handles this.
- config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
+ # Enable static file serving from the `/public` folder (turn off if using NGINX/Apache for it).
+ config.public_file_server.enabled = true
# Compress CSS using a preprocessor.
# config.assets.css_compressor = :sass
@@ -40,67 +39,48 @@
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local
+ # Assume all access to the app is happening through a SSL-terminating reverse proxy.
+ # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
+ # config.assume_ssl = true
+
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
- # Include generic and useful information about system operation, but avoid logging too much
- # information to avoid inadvertent exposure of personally identifiable information (PII).
- config.log_level = :info
+ # Log to STDOUT by default
+ config.logger = ActiveSupport::Logger.new(STDOUT)
+ .tap { |logger| logger.formatter = ::Logger::Formatter.new }
+ .then { |logger| ActiveSupport::TaggedLogging.new(logger) }
# Prepend all log lines with the following tags.
config.log_tags = [ :request_id ]
+ # Info include generic and useful information about system operation, but avoids logging too much
+ # information to avoid inadvertent exposure of personally identifiable information (PII). If you
+ # want to log everything, set the level to "debug".
+ config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
+
# Use a different cache store in production.
# config.cache_store = :mem_cache_store
+ # Use a real queuing backend for Active Job (and separate queues per environment).
+ # config.active_job.queue_adapter = :resque
+ # config.active_job.queue_name_prefix = "test_app_production"
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
- # Send deprecation notices to registered listeners.
- config.active_support.deprecation = :notify
-
- # Log disallowed deprecations.
- config.active_support.disallowed_deprecation = :log
-
- # Tell Active Support which deprecation messages to disallow.
- config.active_support.disallowed_deprecation_warnings = []
-
- # Use default logging formatter so that PID and timestamp are not suppressed.
- config.log_formatter = ::Logger::Formatter.new
-
- # Use a different logger for distributed setups.
- # require "syslog/logger"
- # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
-
- if ENV["RAILS_LOG_TO_STDOUT"].present?
- logger = ActiveSupport::Logger.new(STDOUT)
- logger.formatter = config.log_formatter
- config.logger = ActiveSupport::TaggedLogging.new(logger)
- end
+ # Don't log any deprecations.
+ config.active_support.report_deprecations = false
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
- # Inserts middleware to perform automatic connection switching.
- # The `database_selector` hash is used to pass options to the DatabaseSelector
- # middleware. The `delay` is used to determine how long to wait after a write
- # to send a subsequent read to the primary.
- #
- # The `database_resolver` class is used by the middleware to determine which
- # database is appropriate to use based on the time delay.
- #
- # The `database_resolver_context` class is used by the middleware to set
- # timestamps for the last write to the primary. The resolver uses the context
- # class timestamps to determine how long to wait before reading from the
- # replica.
- #
- # By default Rails will store a last write timestamp in the session. The
- # DatabaseSelector middleware is designed as such you can define your own
- # strategy for connection switching and pass that into the middleware through
- # these configuration options.
- # config.active_record.database_selector = { delay: 2.seconds }
- # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
- # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
+ # Enable DNS rebinding protection and other `Host` header attacks.
+ # config.hosts = [
+ # "example.com", # Allow requests from example.com
+ # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
+ # ]
+ # Skip DNS rebinding protection for the default health check endpoint.
+ # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
end
diff --git a/test_app/config/environments/test.rb b/test_app/config/environments/test.rb
index 98af655..5d1165b 100644
--- a/test_app/config/environments/test.rb
+++ b/test_app/config/environments/test.rb
@@ -8,12 +8,14 @@
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
- config.cache_classes = true
+ # While tests run files are not watched, reloading is not necessary.
+ config.enable_reloading = false
- # Do not eager load code on boot. This avoids loading your whole application
- # just for the purpose of running a single test. If you are using a tool that
- # preloads Rails for running tests, you may have to set it to true.
- config.eager_load = false
+ # Eager loading loads your entire application. When running a single test locally,
+ # this is usually not necessary, and can slow down your test suite. However, it's
+ # recommended that you enable it in continuous integration systems to ensure eager
+ # loading is working properly before deploying your code.
+ config.eager_load = ENV["CI"].present?
# Configure public file server for tests with Cache-Control for performance.
config.public_file_server.enabled = true
@@ -22,12 +24,12 @@
}
# Show full error reports and disable caching.
- config.consider_all_requests_local = true
+ config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.cache_store = :null_store
- # Raise exceptions instead of rendering exception templates.
- config.action_dispatch.show_exceptions = false
+ # Render exception templates for rescuable exceptions and raise for other exceptions.
+ config.action_dispatch.show_exceptions = :rescuable
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
@@ -49,4 +51,7 @@
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
+
+ # Raise error when a before_action's only/except options reference missing actions
+ config.action_controller.raise_on_missing_callback_actions = true
end
diff --git a/test_app/config/initializers/assets.rb b/test_app/config/initializers/assets.rb
index 4b828e8..fe48fc3 100644
--- a/test_app/config/initializers/assets.rb
+++ b/test_app/config/initializers/assets.rb
@@ -5,8 +5,6 @@
# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
-# Add Yarn node_modules folder to the asset load path.
-Rails.application.config.assets.paths << Rails.root.join('node_modules')
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in the app/assets
diff --git a/test_app/config/initializers/content_security_policy.rb b/test_app/config/initializers/content_security_policy.rb
index 35d0f26..b3076b3 100644
--- a/test_app/config/initializers/content_security_policy.rb
+++ b/test_app/config/initializers/content_security_policy.rb
@@ -1,30 +1,25 @@
# Be sure to restart your server when you modify this file.
-# Define an application-wide content security policy
-# For further information see the following documentation
-# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
+# Define an application-wide content security policy.
+# See the Securing Rails Applications Guide for more information:
+# https://guides.rubyonrails.org/security.html#content-security-policy-header
-# Rails.application.config.content_security_policy do |policy|
-# policy.default_src :self, :https
-# policy.font_src :self, :https, :data
-# policy.img_src :self, :https, :data
-# policy.object_src :none
-# policy.script_src :self, :https
-# policy.style_src :self, :https
-# # If you are using webpack-dev-server then specify webpack-dev-server host
-# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
-
-# # Specify URI for violation reports
-# # policy.report_uri "/csp-violation-report-endpoint"
+# Rails.application.configure do
+# config.content_security_policy do |policy|
+# policy.default_src :self, :https
+# policy.font_src :self, :https, :data
+# policy.img_src :self, :https, :data
+# policy.object_src :none
+# policy.script_src :self, :https
+# policy.style_src :self, :https
+# # Specify URI for violation reports
+# # policy.report_uri "/csp-violation-report-endpoint"
+# end
+#
+# # Generate session nonces for permitted importmap, inline scripts, and inline styles.
+# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
+# config.content_security_policy_nonce_directives = %w(script-src style-src)
+#
+# # Report violations without enforcing the policy.
+# # config.content_security_policy_report_only = true
# end
-
-# If you are using UJS then enable automatic nonce generation
-# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
-
-# Set the nonce only to specific directives
-# Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
-
-# Report CSP violations to a specified URI
-# For further information see the following documentation:
-# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
-# Rails.application.config.content_security_policy_report_only = true
diff --git a/test_app/config/initializers/filter_parameter_logging.rb b/test_app/config/initializers/filter_parameter_logging.rb
index 4b34a03..c2d89e2 100644
--- a/test_app/config/initializers/filter_parameter_logging.rb
+++ b/test_app/config/initializers/filter_parameter_logging.rb
@@ -1,6 +1,8 @@
# Be sure to restart your server when you modify this file.
-# Configure sensitive parameters which will be filtered from the log file.
+# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file.
+# Use this to limit dissemination of sensitive information.
+# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
Rails.application.config.filter_parameters += [
:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
]
diff --git a/test_app/config/initializers/permissions_policy.rb b/test_app/config/initializers/permissions_policy.rb
index 00f64d7..7db3b95 100644
--- a/test_app/config/initializers/permissions_policy.rb
+++ b/test_app/config/initializers/permissions_policy.rb
@@ -1,11 +1,13 @@
+# Be sure to restart your server when you modify this file.
+
# Define an application-wide HTTP permissions policy. For further
-# information see https://developers.google.com/web/updates/2018/06/feature-policy
-#
-# Rails.application.config.permissions_policy do |f|
-# f.camera :none
-# f.gyroscope :none
-# f.microphone :none
-# f.usb :none
-# f.fullscreen :self
-# f.payment :self, "https://secure.example.com"
+# information see: https://developers.google.com/web/updates/2018/06/feature-policy
+
+# Rails.application.config.permissions_policy do |policy|
+# policy.camera :none
+# policy.gyroscope :none
+# policy.microphone :none
+# policy.usb :none
+# policy.fullscreen :self
+# policy.payment :self, "https://secure.example.com"
# end
diff --git a/test_app/db/migrate/20231117220800_add_service_name_to_active_storage_blobs.active_storage.rb b/test_app/db/migrate/20231117220800_add_service_name_to_active_storage_blobs.active_storage.rb
new file mode 100644
index 0000000..a15c6ce
--- /dev/null
+++ b/test_app/db/migrate/20231117220800_add_service_name_to_active_storage_blobs.active_storage.rb
@@ -0,0 +1,22 @@
+# This migration comes from active_storage (originally 20190112182829)
+class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0]
+ def up
+ return unless table_exists?(:active_storage_blobs)
+
+ unless column_exists?(:active_storage_blobs, :service_name)
+ add_column :active_storage_blobs, :service_name, :string
+
+ if configured_service = ActiveStorage::Blob.service.name
+ ActiveStorage::Blob.unscoped.update_all(service_name: configured_service)
+ end
+
+ change_column :active_storage_blobs, :service_name, :string, null: false
+ end
+ end
+
+ def down
+ return unless table_exists?(:active_storage_blobs)
+
+ remove_column :active_storage_blobs, :service_name
+ end
+end
diff --git a/test_app/db/migrate/20231117220801_create_active_storage_variant_records.active_storage.rb b/test_app/db/migrate/20231117220801_create_active_storage_variant_records.active_storage.rb
new file mode 100644
index 0000000..94ac83a
--- /dev/null
+++ b/test_app/db/migrate/20231117220801_create_active_storage_variant_records.active_storage.rb
@@ -0,0 +1,27 @@
+# This migration comes from active_storage (originally 20191206030411)
+class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0]
+ def change
+ return unless table_exists?(:active_storage_blobs)
+
+ # Use Active Record's configured type for primary key
+ create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t|
+ t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type
+ t.string :variation_digest, null: false
+
+ t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true
+ t.foreign_key :active_storage_blobs, column: :blob_id
+ end
+ end
+
+ private
+ def primary_key_type
+ config = Rails.configuration.generators
+ config.options[config.orm][:primary_key_type] || :primary_key
+ end
+
+ def blobs_primary_key_type
+ pkey_name = connection.primary_key(:active_storage_blobs)
+ pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name }
+ pkey_column.bigint? ? :bigint : pkey_column.type
+ end
+end
diff --git a/test_app/db/migrate/20231117220802_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/test_app/db/migrate/20231117220802_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb
new file mode 100644
index 0000000..93c8b85
--- /dev/null
+++ b/test_app/db/migrate/20231117220802_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb
@@ -0,0 +1,8 @@
+# This migration comes from active_storage (originally 20211119233751)
+class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0]
+ def change
+ return unless table_exists?(:active_storage_blobs)
+
+ change_column_null(:active_storage_blobs, :checksum, true)
+ end
+end
diff --git a/test_app/db/migrate/20231117224946_add_title_to_posts.rb b/test_app/db/migrate/20231117224946_add_title_to_posts.rb
new file mode 100644
index 0000000..9c076f6
--- /dev/null
+++ b/test_app/db/migrate/20231117224946_add_title_to_posts.rb
@@ -0,0 +1,5 @@
+class AddTitleToPosts < ActiveRecord::Migration[7.0]
+ def change
+ add_column :posts, :title, :string
+ end
+end
diff --git a/test_app/db/schema.rb b/test_app/db/schema.rb
index 53a2f30..c2aedd6 100644
--- a/test_app/db/schema.rb
+++ b/test_app/db/schema.rb
@@ -10,14 +10,13 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2021_01_18_122927) do
-
+ActiveRecord::Schema.define(version: 2023_11_17_224946) do
create_table "active_storage_attachments", force: :cascade do |t|
t.string "name", null: false
t.string "record_type", null: false
t.integer "record_id", null: false
t.integer "blob_id", null: false
- t.datetime "created_at", null: false
+ t.datetime "created_at", precision: nil, null: false
t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
end
@@ -29,8 +28,8 @@
t.text "metadata"
t.string "service_name", null: false
t.bigint "byte_size", null: false
- t.string "checksum", null: false
- t.datetime "created_at", null: false
+ t.string "checksum"
+ t.datetime "created_at", precision: nil, null: false
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
end
@@ -41,8 +40,9 @@
end
create_table "posts", force: :cascade do |t|
- t.datetime "created_at", precision: 6, null: false
- t.datetime "updated_at", precision: 6, null: false
+ t.string "title"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
diff --git a/test_app/test/controllers/admin/posts_controller_test.rb b/test_app/test/controllers/admin/posts_controller_test.rb
index 2e1e4f7..5c0c2e0 100644
--- a/test_app/test/controllers/admin/posts_controller_test.rb
+++ b/test_app/test/controllers/admin/posts_controller_test.rb
@@ -10,5 +10,41 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
assert_response :ok
assert_select "td.cell-data--active-storage > a[href='#{admin_post_path(post)}']"
end
+
+ test "new" do
+ get new_admin_post_path
+
+ assert_response :ok
+ end
+
+ test "create with valid parameters increases Post count by 1" do
+ file = fixture_file_upload("cover_image.jpg")
+
+ assert_difference "Post.count", 1 do
+ post admin_posts_path, params: {
+ post: {
+ title: "New post title",
+ cover_image: file
+ }
+ }
+ end
+
+ assert_response :redirect
+ end
+
+ test "create with invalid parameters does not increase Post count" do
+ file = fixture_file_upload("cover_image.jpg")
+
+ assert_difference "Post.count", 0 do
+ post admin_posts_path, params: {
+ post: {
+ title: "",
+ cover_image: file
+ }
+ }
+ end
+
+ assert_response :unprocessable_entity
+ end
end
end