Skip to main content
Version: v3.0

File Storage

File storage capabilities are available in Rhino with the ActiveStorage. Rhino provides an authenticated endpoint for redirect mode in ActiveStorage as well as direct upload integration on the frontend.

In development ActiveStorage is used to . Set up a cloud provider storage service to use ActiveStorage in production and then use the standard has_one_attached and has_many_attached methods to attach files to your models and add the attachment as a permitted reference in your controller.

class Blog < ApplicationRecord
belongs_to :user

has_one_attached :banner

rhino_owner_base
rhino_references [:banner_attachment]
end

S3

To use S3 as your cloud provider, add the aws-sdk-s3 gem to your Gemfile:

bundle add aws-sdk-s3

Then configure your storage service in with the environment variables AWS_ACCESS_KEY, AWS_SECRET_KEY, AWS_REGION, and AWS_S3_BUCKET which are used by default in config/storage.yml:

config/storage.yml
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
region: <%= ENV['AWS_REGION'] %>
bucket: <%= ENV['AWS_S3_BUCKET'] %>

And finally, change the active storage service from :local to :amazon in config/environments/production.rb file:

config.active_storage.service = :amazon
warning

You must set up CORS for the bucket you are using to allow uploads from your domain. See this sample for more information.

Google Cloud Storage

To use Google Cloud Storage as your cloud provider, add the google-cloud-storage gem to your Gemfile:

bundle add google-cloud-storage

Then configure your storage service in with the environment variables GOOGLE_ACCOUNT_TYPE, GOOGLE_PROJECT_ID, GOOGLE_PRIVATE_KEY_ID, GOOGLE_PRIVATE_KEY, GOOGLE_CLIENT_EMAIL, GOOGLE_CLIENT_ID and GOOGLE_BUCKET which are used by default in config/storage.yml:

config/storage.yml
google:
service: GCS
credentials:
type: <%= ENV.fetch('GOOGLE_ACCOUNT_TYPE') %>
project_id: <%= ENV.fetch('GOOGLE_PROJECT_ID') %>
private_key_id: <%= ENV.fetch('GOOGLE_PRIVATE_KEY_ID') %>
private_key: |
<%= ENV.fetch('GOOGLE_PRIVATE_KEY').lines.map.with_index { |l, i| i == 0 ? l : " #{l}" }.join %>
client_email: <%= ENV.fetch('GOOGLE_CLIENT_EMAIL') %>
client_id: <%= ENV.fetch('GOOGLE_CLIENT_ID') %>
project: <%= ENV.fetch('GOOGLE_PROJECT_ID') %>
bucket: <%= ENV.fetch('GOOGLE_BUCKET') %>

And finally, change the active storage service from :local to :google in config/environments/production.rb file:

config.active_storage.service = :google
warning

You must set up CORS for the bucket you are using to allow uploads from your domain. See this sample for more information.