Class: Decidim::ContentBlock

Inherits:
ApplicationRecord show all
Includes:
Publicable
Defined in:
app/models/decidim/content_block.rb

Overview

this class represents a content block manifest instance in the DB. Check the docs on ‘ContentBlockRegistry` and `ContentBlockManifest` for more info.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Publicable

#publish!, #published?, #unpublish!

Instance Attribute Details

#in_previewObject

Returns the value of attribute in_preview.



9
10
11
# File 'app/models/decidim/content_block.rb', line 9

def in_preview
  @in_preview
end

Class Method Details

.for_scope(scope, organization:) ⇒ Object

Public: finds the published content blocks for the given scope and organization. Returns them ordered by ascending weight (lowest first).



22
23
24
25
# File 'app/models/decidim/content_block.rb', line 22

def self.for_scope(scope, organization:)
  where(organization: organization, scope_name: scope)
    .order(weight: :asc)
end

Instance Method Details

#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’s a little bit hacky, but it’s 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 versions too.
content_block.images_container.my_image.url
content_block.images_container.my_image.big.url
content_block.save!

# 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.



71
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
122
123
124
125
126
127
128
129
130
131
132
133
# File 'app/models/decidim/content_block.rb', line 71

def images_container
  return @images_container if @images_container

  manifest = self.manifest

  @images_container = Class.new do
    extend ::CarrierWave::Mount
    include ActiveModel::Validations

    cattr_accessor :manifest, :manifest_scope
    attr_reader :content_block

    # Needed to calculate uploads URLs
    delegate :id, :organization, to: :content_block

    # Needed to customize the upload URL
    def self.name
      to_s.camelize
    end

    # Needed to customize the upload URL
    def self.to_s
      "decidim/#{manifest.name.to_s.underscore}_#{manifest_scope.to_s.underscore}_content_block"
    end

    def initialize(content_block)
      @content_block = content_block
    end

    def manifest
      self.class.manifest
    end

    manifest.images.each do |image_config|
      mount_uploader image_config[:name], image_config[:uploader].constantize
    end

    # This is used to access the upload file name from the container, given
    # an image name.
    def read_uploader(column)
      content_block.images[column.to_s]
    end

    # This is used to set the upload file name from the container, given
    # an image name.
    def write_uploader(column, value)
      content_block.images[column.to_s] = value
    end

    # When we save the content block, we force the container to save itself
    # too, so images can be processed, uploaded and stored in the DB.
    def save
      manifest.images.each do |image_config|
        send(:"write_#{image_config[:name]}_identifier")
        send(:"store_#{image_config[:name]}!")
      end
    end
  end

  @images_container.manifest = manifest
  @images_container.manifest_scope = scope_name
  @images_container = @images_container.new(self)
end

#manifestObject



27
28
29
# File 'app/models/decidim/content_block.rb', line 27

def manifest
  @manifest ||= Decidim.content_blocks.for(scope_name).find { |manifest| manifest.name.to_s == manifest_name }
end

#reloadObject



41
42
43
44
# File 'app/models/decidim/content_block.rb', line 41

def reload(*)
  @images_container = nil
  super
end

#settingsObject

Public: Uses the ‘SettingsManifest` class to generate a settings schema and fill it with the content blocks current settings. This eases the access to those settings values.

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



37
38
39
# File 'app/models/decidim/content_block.rb', line 37

def settings
  manifest.settings.schema.new(self[:settings])
end