Class: Decidim::ContentBlock
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Decidim::ContentBlock
- 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
-
#in_preview ⇒ Object
Returns the value of attribute in_preview.
Class Method Summary collapse
-
.for_scope(scope, organization:) ⇒ Object
Public: finds the published content blocks for the given scope and organization.
Instance Method Summary collapse
-
#images_container ⇒ Object
Public: Holds access to the images related to the content block.
- #manifest ⇒ Object
- #reload ⇒ Object
-
#settings ⇒ Object
Public: Uses the ‘SettingsManifest` class to generate a settings schema and fill it with the content blocks current settings.
Methods included from Publicable
#publish!, #published?, #unpublish!
Instance Attribute Details
#in_preview ⇒ Object
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_container ⇒ Object
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 |
#manifest ⇒ Object
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 |
#reload ⇒ Object
41 42 43 44 |
# File 'app/models/decidim/content_block.rb', line 41 def reload(*) @images_container = nil super end |
#settings ⇒ Object
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 |