まさ@ブログ書き込み中

自由に生きるための英語、プログラミング、考えごとについて色々書いています。

Railsでpollingする(Ajax)

 

みなさんこんばんは。まさです。

最近コードを書いていて学びになったことを書きます。

コードについて書くの久しぶりだな。

 

 

セッションの限界

ユーザの状態とかを把握する際に、ステートレスなHTTP通信でステートフルにするためにセッションを使うことはよくあると思います。

 

今回僕は「セッションが切れたら○○する」といった機能を実装しなければならなくて、セッションがexpireした時に出来る処理などについて色々調べてみました。

 

でも、どうにもならない。僕はパッと「セッションが期限切れになるときに何かが起こっているはずだから、そこにお邪魔して僕のコード書かせてもらおう」という感じで考えていたのですが、どうやらセッションがexpireした時の挙動をこちら側ではいじくりまわせなさそう。

 

さてどうしようかと考えて、僕の来年度の就職先であるみんなのウェディングの技術部のマネージャーの方にアドバイスを求めたところ、jsのpollingが一つの手かもしれない、ということを教えてもらいました。

 

 

状態管理はセッションだけができるわけじゃないんだなあ

ググってみたところ、ITにおけるpollingとは

ポーリング(polling)とは、通信ソフトウェアにおいて、競合を回避したり、送受信の準備状況を判断したり、処理を同期したりするために、複数の機器やプログラムに対して順番に定期的に問い合わせを行い、一定の条件を満たした場合に送受信や処理を行う通信及び処理方式のことである。

 

で、今回のjsによるpollingとはAjaxなどを使ってクライアントから非同期でリクエストを送りRailsAPIを叩くということでした。

kimulla.hatenablog.com

 

例えばAjaxを使うなら「window.setTimeoutなどを使って定期的にサーバにリクエストをなげる」ということです。

 

状態管理ってセッションだけじゃないんだ!!とわかり、学びを深めることができました。jsってどうしてもフロントのデザインや挙動をどうこうするっていうイメージが先行してしまっていたんですよね・・・。Ajaxはしっていたんだけどなあ。

 

Railsの仕様を理解しないとAjaxもできない

さて、Ajaxでサーバにリクエストを送りましょう、となったときに422 Unprocessable Entityというエラーが起きてしまいました。

 

このエラーは一般的には「処理できないエンティティ。WebDAVの拡張ステータスコード」とかいうものらしく「ようするに、あるオブジェクトの変更などの処理がうまくできない場合に発生するエラー」らしいです。何らかのバリデーションに引っかかっているときにこのエラーが起きるとか。

 

でも変なデータは送っていないけどな・・と思ったら。こんな記事が。

nonbiri-tereka.hatenablog.com

 

要するにPOSTをする際にはCross-Site Request Forgeries(CSRF)を防ぐためにこちら側用意したAuthenticityTokenも一緒に送信しなければならなかったのですね。

 

 

んで、今回は何となくAPIを叩く時のメソッドをPOSTにしただけで、別に直URLで叩かれても困らなかったので該当アクションをGETメソッドに変えて、動作させることができました。

 

 

「いや、もう無理だろ」っていう問題にぶち当たっては解決していくプロセスを繰り返していくと、不完全そうなWebの仕組みを上手く補う技術がたくさんあることに毎回驚きます。

 

今回もそんな風に思いました。終わり。