diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-20 17:34:13 -0500 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-20 17:34:13 -0500 |
commit | 1c85eecee02ebf0c0148de807fbb1a9e9573af8a (patch) | |
tree | 0d5548f150ae825210f7ba04d4bc9fee9d686fbc /app/controllers | |
parent | 1a9026b485b9b1da0f34c526d4c901406074c508 (diff) | |
download | rails-1c85eecee02ebf0c0148de807fbb1a9e9573af8a.tar.gz rails-1c85eecee02ebf0c0148de807fbb1a9e9573af8a.tar.bz2 rails-1c85eecee02ebf0c0148de807fbb1a9e9573af8a.zip |
Move controllers to default engine location for auto loading
Diffstat (limited to 'app/controllers')
-rw-r--r-- | app/controllers/active_storage/disk_controller.rb | 38 | ||||
-rw-r--r-- | app/controllers/active_storage/variants_controller.rb | 22 |
2 files changed, 60 insertions, 0 deletions
diff --git a/app/controllers/active_storage/disk_controller.rb b/app/controllers/active_storage/disk_controller.rb new file mode 100644 index 0000000000..16a295d00d --- /dev/null +++ b/app/controllers/active_storage/disk_controller.rb @@ -0,0 +1,38 @@ +require "action_controller" +require "active_storage/blob" +require "active_storage/verified_key_with_expiration" + +require "active_support/core_ext/object/inclusion" + +# This controller is a wrapper around local file downloading. It allows you to +# make abstraction of the URL generation logic and to serve files with expiry +# if you are using the +Disk+ service. +# +# By default, mounting the Active Storage engine inside your application will +# define a +/rails/blobs/:encoded_key/*filename+ route that will reference this +# controller's +show+ action and will be used to serve local files. +# +# A URL for an attachment can be generated through its +#url+ method, that +# will use the aforementioned route. +class ActiveStorage::DiskController < ActionController::Base + def show + if key = decode_verified_key + blob = ActiveStorage::Blob.find_by!(key: key) + + if stale?(etag: blob.checksum) + send_data blob.download, filename: blob.filename, type: blob.content_type, disposition: disposition_param + end + else + head :not_found + end + end + + private + def decode_verified_key + ActiveStorage::VerifiedKeyWithExpiration.decode(params[:encoded_key]) + end + + def disposition_param + params[:disposition].presence_in(%w( inline attachment )) || "inline" + end +end diff --git a/app/controllers/active_storage/variants_controller.rb b/app/controllers/active_storage/variants_controller.rb new file mode 100644 index 0000000000..05685dca17 --- /dev/null +++ b/app/controllers/active_storage/variants_controller.rb @@ -0,0 +1,22 @@ +class ActiveStorage::VariantsController < ActionController::Base + def show + if blob_key = decode_verified_blob_key + redirect_to processed_variant_for(blob_key).url(disposition: disposition_param) + else + head :not_found + end + end + + private + def decode_verified_blob_key + ActiveStorage::VerifiedKeyWithExpiration.decode(params[:encoded_blob_key]) + end + + def processed_variant_for(blob_key) + ActiveStorage::Variant.find_or_process_by!(blob_key: blob_key, encoded_variant_key: params[:encoded_variant_key]) + end + + def disposition_param + params[:disposition].presence_in(%w( inline attachment )) || 'inline' + end +end |