So, recently I was working on a rails app (shameless plug) where I needed to add an image for every article in a database, and while checking the requirements I read this:
You can store the image as a string, since uploading images to Heroku is tricky and not required for this project.
I immediately choose the responsible approach and took it as a challenge, I mean, How tricky could it possibly be?. Well, my friends, it was indeed, really tricky.
In my first try, I just uploaded my project to Heroku to see it fail, I wanted to see exactly what happened since most of the time you can learn a lot from the logs of an error, Does it break entirely? Does it reject the project on Heroku?. But it didn't, the app loads correctly, Heroku doesn't complain, and you can upload images, so What was going on? Did they just lie to me? That wasn't tricky at all. So I googled a little and got this article from Heroku themselves where they explain:
... [files] will appear to work at first, [but] the attachments will exhibit seemingly strange behavior and eventually disappear.
And back at the app... oh... oh no...
Luckily, the lovely people at Heroku left a tutorial on how to use AWS with active storage, unluckily for me, I'm currently banned from AWS. So I followed a link to get other services with active storage and got 3 options, Google Cloud Storage(GCS), Microsoft Azure and.. AWS, so only 2 options.
GCS and Azure share a lot of things, they both have free tiers/trial periods, they are both own by giant tech companies, and they both require my credit card to get into the free tier because they are owned by giant tech companies, see the circle here?
Now that wouldn't be that much of a problem if at least they accepted my debit card, which they didn't, so It was time to google again, and then... when everything seemed grey, I found the Github Students Pack. Turns out, GitHub hooks you up with A LOT of freebies if you are studying, one of them being, you guessed it, a Microsoft Azure Students account.
Ok, now I have the keys to the kingdom, but What do I do with them?, I went back to the rails guides, and made my last mistake (of the day at least). I entered
Now, in my defense, they both look exactly the same if not for a little badge on the top right saying 'edge', which in retrospective I should've seen waaaaay before, which resulted in hours of trials and errors, and me asking myself if I'm a real programmer, and thinking of maybe just uploading strings with the URL of the file, because, I mean, it was not required, and frankly, uploading images to Heroku can be tricky.
But in the end, it was our old friend, the old issue on GitHub with the same problem as you, which came to my rescue. Looks like in the Edge Guides, they recommend using "azure-storage-blob", but in the normal guides they say you should use "azure-storage", and when someone asked in the "-blob" repo How to use it in the active storage, the answer was pretty much, "Yeah, I don't know what you're talking about".
So here we are, we have all the pieces, and we are ready to add some actual code. Amazing.
The first thing you wanna do is enter you Azure account and go to Storage accounts, and create a new one
Now, I'm gonna be real with you guys, I don't know how much information I can share from inside my Azure account without being hacked or something like that, and since I'm literally in a site called Hackernoon... I'm not gonna risk it, but this is the data you need to change in this page, you can name both whatever you want, I choose greeks and herojourney, all of the other blued-out fields, I didn't change anything, and hit Review + create at the bottom left, then create again.
Then you're gonna have to wait for a little bit, until the page show you Your deployment is complete. Then click on go to the resource
Now you need to go first to the containers, add a new container
And finally, to you access keys, you want these one (the one covered in orange):
Finally, you want to add this configuration on your config/storage
azure: service: AzureStorage storage_account_name: <%= ENV['STORAGE_ACCOUNT_NAME'] %> storage_access_key: <%= ENV['STORAGE_ACCESS_KEY'] %> container: <%= ENV['STORAGE_CONTAINER'] %>
This in your .env (assuming you are using dotenv and don't want to share your keys online)
STORAGE_ACCOUNT_NAME=your_account_name STORAGE_ACCESS_KEY=your_access_key STORAGE_CONTAINER=your_storage_container
Add this gem to your Gemfile
In the end, and after a lot of struggle, I pushed the changes into my repo, and there they where in all their glory
A couple of things to note, as you may have guessed, Azure is a paid service so keep notice of your containers, and use the local active storage in development. If you have any question you can check the repo where the code for this app is hosted, or contact me on my socials, thank you for taking the time to read my article, and happy coding :D.
Last minute edit: I'm obviously not being paid by Azure, but hacker asked me before submitting, so I thought of making in completely clear.