Consentimiento de cookies para Ruby on Rails

El banner es una etiqueta en application.html.erb, antes de tu importmap o bundle. Se mantiene entre navegaciones de Turbo Drive, y los consentimientos que piden tus formularios se registran desde el controlador con una llamada HTTP, cada uno con su justificante firmado.

Configúralo con tu agente de IA

Conecta el servidor MCP de Croombit a tu editor o agente de código y pega esto. Crea el sitio, las categorías de cookies y el banner, y edita tu código.

Con Croombit: crea un sitio para este proyecto y mantén las categorías de cookies que trae. Escribe el texto del banner y publícalo. Crea una clave publicable de TEST para localhost:3000. Es una app Rails: añade la etiqueta de cmp.js con javascript_include_tag al principio del <head> de app/views/layouts/application.html.erb, con la clave de ENV["CROOMBIT_PUBLISHABLE_KEY"], permítela en nuestra CSP si la tenemos y registra la casilla de newsletter de nuestro controlador de alta con un POST a /v1/consent usando CROOMBIT_SECRET_KEY.

El agente trabaja en TEST. Pasar a LIVE son dos pasos en la consola: verificar tu dominio y cambiar a una clave LIVE; consulta pasar a LIVE.

O a mano

1. Añade la etiqueta al layout

data: { tc_api_key: … } se renderiza como data-tc-api-key. Usa pk_test_… en desarrollo y pk_live_… en producción.

<%# app/views/layouts/application.html.erb %>
<head>
  <meta charset="utf-8">
  <%= javascript_include_tag "https://croombit.com/cmp.js",
        data: { tc_api_key: ENV.fetch("CROOMBIT_PUBLISHABLE_KEY") } %>
  <%= csrf_meta_tags %>
  <%# …everything else after it %>
  <%= javascript_importmap_tags %>
</head>

2. Permítela en tu CSP

# config/initializers/content_security_policy.rb — only if you enabled a CSP
Rails.application.configure do
  config.content_security_policy do |policy|
    policy.script_src  :self, "https://croombit.com"
    policy.connect_src :self, "https://api.croombit.com"
  end
end

3. Retén los rastreadores

Etiquetas en tus vistas: type="text/plain" más data-tc-consent. En una visita de Turbo, los scripts etiquetados de la página nueva se ejecutan en cuanto se acepta su categoría.

<script type="text/plain" data-tc-consent="analytics" async
        src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<script type="text/plain" data-tc-consent="analytics">
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-XXXX');
</script>

4. Registra consentimientos desde el controlador

Un POST /v1/consent normal con tu clave secreta. La cabecera Idempotency-Key hace que reintentar sea seguro. Consulta Registrar y consultar consentimiento.

require "net/http"

# e.g. in the controller that handles your signup form
uri = URI("https://api.croombit.com/v1/consent")
req = Net::HTTP::Post.new(uri,
  "Authorization" => "Bearer #{ENV.fetch('CROOMBIT_SECRET_KEY')}",
  "Content-Type" => "application/json",
  "Idempotency-Key" => SecureRandom.uuid)
req.body = {
  subject: "email:#{user.email}",
  purpose: "newsletter",
  state: params[:newsletter] == "1" ? "GRANTED" : "DENIED",
  channel: "signup_form"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "Croombit: #{res.code} #{res.body}" unless res.is_a?(Net::HTTPSuccess)

Preguntas

¿Funciona con Turbo Drive?

Sí. Turbo sustituye el cuerpo de la página en cada visita; el banner y el botón flotante se mantienen, y la decisión vale para todas las páginas.

¿Funciona con Rails 6 y Webpacker?

Sí. Deja la etiqueta la primera del <head>, antes de javascript_pack_tag.