みっきーの備忘録。

学んだことや思ったことなんかを色々と。

【Rails】 POSTで422 (Unprocessable Entity)エラー

解決したい事

user_contentsテーブルを扱うUserContentsControllerを新たに作り、動画の再生が終わったら非同期(ajax)で2つの情報を保存したい。

その際に、422 (Unprocessable Entity)エラーが起こる。

解決方法

RailsではデフォルトでCSRF対策をおこなっています。 CSRFトークンを発行せずにPOSTした場合に弾かれます。 なので、CSRFトークンを渡してあげる必要があります。

CSRF(クロスサイトリクエストフォージェリ)とは、Webアプリケーションの脆弱性またはその脆弱性を利用した攻撃方法です。 なりすましや覚えのない請求などの被害にあったりする危険性があります。

422 (Unprocessable Entity)

f:id:mikk0tan:20211022094656p:plain
エラーログ

パラメータにトークンを付与する

$.ajax(
           {
           headers: {
                  'X-Requested-With': 'XMLHttpRequest',
                  'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') //CSRFトークンを取得・セット
            },
            url: '<%= myquest_content_user_contents_path(@quest,@content)%>',
            type: 'POST',
            data: {
                  user_contents: { video_time: document.getElementById('time').value }
                  //動画の時間をわたす。
             }
});