has_many field for Active Storage attachments
Active Storage is implemented as an association we can take advantage of that and make the users' experience so much better!
Create the resource
For that you should create an
attachment_resource.rb and configure it like so.
bin/rails generate avo:resource active_record_attachment
Please don't use the name
AttachmentResource because the generated controller will override Avo's internal controller that handles the attachments.
class ActiveRecordAttachmentResource < Avo::BaseResource self.title = :filename self.model_class = "ActiveStorage::Attachment" field :id, as: :id field :filename, as: :text field :service_url, as: :external_image, name: "Image" field :created_at, as: :date_time end
Next, add it to your resource that
class Project < ApplicationRecord has_many_attached :files end class ProjectResource < Avo::BaseResource # Please make sure you use the _attachments suffix. # So the :files key from the model file becomes :files_attachments on the resource file. field :files_attachments, as: :has_many end
We suggest making this resource read-only using Pundit policies so you don't accidentaly update Active Storage keys and settings.
We can use the same resource on a different
class Post < ApplicationRecord has_one_attached :cover_photo end class PostResource < Avo::BaseResource # Please make sure you use the _attachment suffix. # So the :cover_photo key from the model file becomes :cover_photo_attachment on the resource file. field :cover_photo_attachment, as: :has_one end