RoR 2.xのajaxでグレースフルデグラデーションにrespond_toを使用する
-
02-07-2019 - |
質問
Ruby on Railsを使用したWeb開発に関するAWDRの本を調べていましたが、古いコードの問題の1つは、使用されるビューがjavascriptビューであることを確認するためにrespond_toを使用しなかったことです。今、いくつかの更新された例で、私は人々が後でそれらを言及しているのを見ました、グレースフルデグラデーションを実装するとき、request.xhrを使用しますか?ユーザーのjavascriptが有効になっているかどうかを確認し、有効になっていない場合はユーザーをリダイレクトします。
respond_toを使用して同じ振る舞いを得ることができるかどうか、もしそうなら、これが良い形であるかどうか、そしてその理由は?
だから私がやろうとしているのは次のようなものです:
def function
respond_to do |format|
format.js do
basic_stuff
end
format.html do
basic_stuff
user_redirect
end
end
end
それはDRYの原則にそっくり違反しているように見えますが、ここでユーザーとサーバーがどのようにやり取りしているのかについて何か見逃しているのでしょう。正直なところ、APIのドキュメントでは完全に明確になっていませんでした。
解決
次のようにリファクタリングできます:
def function
basic_stuff # executed regardless of the mime types accepted
respond_to do |format|
format.html do
user_redirect
end
end
# will fall back rendering the default view - which you should ensure will be js
end
request.xhr?
は、リクエストの X-Requested-With
ヘッダーを調べます(ヘッダーに" XMLHttpRequest"が含まれているかどうかを確認します)。 respond_to
は、受け入れられたMIMEタイプを調べます。
いずれかを使用して、何らかの優雅な分解を実装できます。
しかし ajax呼び出しでヘッダーが設定されていない限り、正常な分解には xhr?
を使用できません(Prototypeはこれを自動的に行います)。
さらに、 respond_to
により柔軟性が増します。つまり、xml、json、jsなど、同じブロックからのものを送信できます。
だからここで respond_to
をお勧めします。