Tuve el mismo problema pero con páginas que fueron almacenadas en caché. Las páginas se almacenaron con un token de autenticidad obsoleto y todas las acciones que utilizan los métodos post / put / delete se reconocieron como intentos de falsificación. Se devolvió el error (422 Entidad no procesable) al usuario.
La solución para Rails 3:
Agregar:
skip_before_filter :verify_authenticity_token
o como "sagivo" señaló en Rails 4 agregar:
skip_before_action :verify_authenticity_token
En páginas que hacen caché.
Como se ha comentado @toobulkeh esto no es una vulnerabilidad en :index
, :show
acciones, pero cuidado con el uso de este sobre :put
, :post
acciones.
Por ejemplo:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Referencia: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Nota agregada por barlop- Rails 4.2 desaprobó skip_before_filter a favor de skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "La familia de métodos * _filter se ha eliminado de la documentación. Su uso se desaconseja a favor de la acción * _ familia de métodos "
Para Rails 6 (como señaló "collimarco") puede usar skip_forgery_protection
y es seguro usarlo para una API REST que no usa datos de sesión.