-
-
Save onerinas/42a4eae14bbcde2380f7719861ee6996 to your computer and use it in GitHub Desktop.
Active Storage as Attachment in Rails API with base64 decoding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
json.extract! document, :id, :documentable_type, :documentable_id, :created_at | |
json.url rails_blob_url(document.doc) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Document < ApplicationRecord | |
has_one_attached :doc | |
belongs_to :documentable, polymorphic: true, optional: true | |
attr_accessor :doc_contents | |
attr_accessor :doc_name | |
after_create :parse_doc | |
validate :doc_validations, on: :create | |
def parse_doc | |
# If directly uploaded | |
unless self.doc_contents.nil? || self.doc_contents[/(image\/[a-z]{3,4})|(application\/[a-z]{3,4})/] == '' | |
content_type = self.doc_contents[/(image\/[a-z]{3,4})|(application\/[a-z]{3,4})/] | |
content_type = content_type[/\b(?!.*\/).*/] | |
contents = self.doc_contents.sub /data:((image|application)\/.{3,}),/, '' | |
decoded_data = Base64.decode64(contents) | |
filename = self.doc_name || 'doc_' + Time.zone.now.to_s + '.' + content_type | |
File.open("#{Rails.root}/tmp/images/#{filename}", 'wb') do |f| | |
f.write(decoded_data) | |
end | |
self.doc.attach(io: File.open("#{Rails.root}/tmp/images/#{filename}"), filename: filename) | |
FileUtils.rm("#{Rails.root}/tmp/images/#{filename}") | |
end | |
end | |
private | |
def doc_validations | |
if self.doc_contents.nil? | |
errors.add(:base, I18n.t('errors.documents.file_required')) | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class DocumentsController < ApplicationController | |
before_action :authenticate_user, only: %i[create] | |
def create | |
@document = Document.new(document_params) | |
if @document.save | |
return success_document_save | |
else | |
return error_save @document | |
end | |
end | |
protected | |
def success_document_save | |
render status: :created, template: 'documents/show.json.jbuilder' | |
end | |
def error_save obj | |
render status: :unprocessable_entity, json: {errors: obj.errors.full_messages} | |
end | |
private | |
def document_params | |
params.permit(:doc_contents, :doc_name) | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CreateDocuments < ActiveRecord::Migration[5.2] | |
def change | |
create_table :documents do |t| | |
t.references :documentable, polymorphic: true, index: true | |
t.timestamps | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
en: | |
errors: | |
documents: | |
file_required: "file attachment is required" | |
content_type: "attachment must be image or pdfs" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
json.partial! 'documents/document.json.jbuilder', document: @document |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment