Method: Decidim::ContentBlock#images_container

Defined in:
decidim-core/app/models/decidim/content_block.rb

#images_containerObject

Public: Holds access to the images related to the content block. This method generates a dynamic class that encapsulates the uploaders for the content block images, and eases the access to them. It is a little bit hacky, but it is the only way I could come up with in order to let content block images have different uploaders.

Examples:

# This will process the image with the uploader defined at the
# manifest, upload it and save the record.
content_block.images_container.my_image = params[:my_image]
content_block.save!

# This is how you can access the image data, just like with any other
# uploader field. You can use the uploader variants too.
content_block.images_container.attached_uploader(:my_image).url
content_block.images_container.attached_uploader(:my_image).variant_url(:big)

# This will delete the attached image
content_block.images_container.my_image = nil
content_block.save!

Returns an object that responds to the image names defined in the content block manifest.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'decidim-core/app/models/decidim/content_block.rb', line 72

def images_container
  return @images_container if @images_container

  attachments = manifest_attachments

  @images_container = Class.new do
    include ActiveModel::Validations
    include Decidim::HasUploadValidations

    cattr_accessor :manifest_attachments
    attr_reader :content_block

    def self.name
      to_s.camelize
    end

    delegate :id, :organization, to: :content_block

    def initialize(content_block)
      @content_block = content_block
    end

    attachments.each do |name, attachment|
      validates_upload name, uploader: attachment.uploader

      define_method(name) do
        attachment.file
      end

      define_method("#{name}=") do |file|
        attachment.file = file
      end
    end

    def attached_uploader(name)
      return if manifest_attachments[name].blank?

      manifest_attachments[name].attached_uploader(:file)
    end

    def save
      return unless content_block.persisted?

      manifest_attachments.values.map(&:save).all?
    end
  end

  @images_container.manifest_attachments = manifest_attachments
  @images_container = @images_container.new(self)
end