Skip to main content

Binding and relations

Overview

rest_enhancement adds serializer fields and optional HTTP cache contributors for an extension without editing core serializers.

When to use

  • Another gem augments proposal show (or similar) with extra relationships or meta.
  • You must keep 304 correct when added data changes.

Example

1. Register rest_enhancement in the engine

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

Decidim::RestFull::Extension.register(:widgets) do |ext|
ext.rest_enhancement(
serializer: "Decidim::Api::RestFull::Proposals::ProposalSerializer",
http_cache_profile: :proposal_show
) do |e|
# step 2–3
end
end

http_cache_profile must match the controller fingerprint (:proposal_show, :resource_show, …).

2. Declare relationships, meta, or attributes

ext.rest_enhancement(
serializer: "Decidim::Api::RestFull::Proposals::ProposalSerializer",
http_cache_profile: :proposal_show
) do |e|
e.has_many :widgets,
serializer: Decidim::Api::RestFull::Widgets::WidgetSerializer do |proposal, _params|
proposal.widgets
end
end

3. Register http_cache when extra tables affect the body

e.http_cache do |h|
h.cache_time { |proposal| proposal.widgets.maximum(:updated_at) }
h.etag_segment { |proposal| proposal.widgets.count }
end

Without cache_time / etag_segment, clients can get stale 304 responses.

4. Rely on strict mode in CI

spec/spec_helper.rb sets strict_rest_enhancement_http_cache when ENV["CI"]=1.

Rules

RuleDetail
ProfileMust match controller fingerprint profile.
Missing cache facetStale 304; CI warns or fails when strict.
RegistryFingerprintContributorRegistry + SerializerAdditionsRegistry
CasePath
Conditional GETdecidim-restfull-core/spec/requests/.../jobs/api_jobs_async_and_conditional_get_spec.rb

See also