Skip to main content

Spaces and components

Overview

Participatory content is addressed by space + component. Core serves /spaces and /components/search; feature gems add manifest routes and serializers.

When to use

  • You expose component-backed CRUD (blogs, proposals, forms).
  • You only need OpenAPI component shapes (adapter gems).

Example

1. Subclass Core::ResourcesController

decidim-restfull-blogs/app/controllers/decidim/api/rest_full/blogs/blogs_controller.rb

class BlogsController < Decidim::Api::RestFull::Core::ResourcesController

2. Scope with filter_for_context

def collection
query = filter_for_context(model_class.all)
query = query.where(decidim_component_id: params.require(:component_id)) if params.key?(:component_id)
ordered(query)
end

Uses ParticipatorySpaceVisibility — do not bypass for public listings.

3. Require participatory query params in specs

decidim-restfull-blogs/spec/requests/decidim/api/rest_full/blogs/blogs_controller_show_spec.rb

let(:component_id) { component.id }
let(:space_id) { participatory_process.id }
let(:space_manifest) { "participatory_processes" }

4. Serializer-only adapter (no routes)

Register OpenAPI component schema + permissions in the engine; clients discover the component via GET /components/search. Debates, meetings, budgets follow this pattern.

5. Optional component manifest routes

decidim-restfull-blogs/lib/decidim/rest_full/blogs/engine.rb

resources :components, only: [] do
collection do
resources :blog_components,
only: [:index, :show],
controller: "/decidim/api/rest_full/components/blog_components"
end
end

resources :blogs,
only: [:index, :show],
controller: "/decidim/api/rest_full/blogs/blogs"

Rules

RuleDetail
VisibilitySame rules as proposals/blogs — no public bypass in filter_for_context.
Adapter gemsSchemas + permissions only; no participatory list route.
Component CRUDGET uses conditional GET — HTTP cache.
CasePath
Space showdecidim-restfull-core/spec/requests/.../spaces/spaces_controller_show_spec.rb
Proposal componentsdecidim-restfull-proposals/spec/requests/.../proposal_components_controller_index_spec.rb

See also