Hello Rails Team!
First of all I want to thank you for all job that you make here!!! Rails is 
a wonderful framework to work with.

I am creating an issue because I am not sure I have understood all 
functionalities of ActiveStorage. My pull request is not quite ready...

Here is my issue: **ActiveStorage custom storage path configuration per 
Model attribute**

Here is our business issue: *We use the [apartment 
gem](https://github.com/influitive/apartment) to split our datas on a 
client basis and we want to make the same with uploaded files and store 
them in separate folders.*

**thoughtbot** has made a wonderfull [paperclip 
gem](https://github.com/thoughtbot/paperclip), but since it is deprecated 
we are in the process of switching to ActiveStorage all our attachments 
management.

In Paperclip there is a fine feature where you can choose a [specific 
storage path](https://github.com/thoughtbot/paperclip) for each of the 
model attachable attribute and interpolate values in it as follows:

```ruby
# app/models/user.rb

# in Paperclip
has_attached_file :avatar,
                  path: ':tenant/users/:user_id/:hash/:filename'
```

### Expected behaviour
Being able to configure a custom path.
The idea is to make this possible in ActiveStorage too and have something 
like that:

```ruby
# app/models/user.rb

# in future ActiveStorage
has_one_attached :avatar,
                 path: ':tenant/users/:id/:unique_secure_token'
```

*### Our current solution*
For the moment we have made a *monkey_patching* to implement those storage 
path by changing the `ActiveStorage::Blob#key`.

```ruby
# app/models/user.rb

def document=(attachable)
  document.attach(create_blob(attachable))
end

def attachable_storage_path
  [
    Apartment::Tenant.current.parameterize,
    'users',
    id,
    ActiveStorage::Blob.generate_unique_secure_token
  ].compact.join('/')
end
```


```ruby
# app/models/application_record.rb

def attachable_storage_path
  raise NotImplementedError
end

def create_blob(attachable)
  return if attachable.nil?

  ActiveStorage::Blob.new.tap do |blob|
    blob.filename = attachable.original_filename
    blob.key = attachable_storage_path
    blob.upload(attachable)
    blob.save!
  end
end
```

### Future solution
I have began to make a PR on ActiveStorage but want to have your feedback 
on this feature before digging deeper in this problematic and validate the 
right direction!

Here it is: https://github.com/frantisekrokusekpa/rails/pull/1/files

Thank you for your feedback and advices!

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-core/3ec91c68-2216-4a57-ac4c-39ddde11f1e2%40googlegroups.com.

Reply via email to