Использование respons_to для постепенного ухудшения с помощью ajax в RoR 2.x
-
02-07-2019 - |
Вопрос
Я просматривал книгу AWDR по веб-разработке с ruby on rails, и одна из проблем со старым кодом заключалась в том, что он не использовал respons_to, чтобы убедиться, что используемое представление будет представлением javascript.Теперь в некоторых обновленных примерах, которые я видел, люди упоминают, что они позже, при реализации graceful degradation, используют request.xhr ?чтобы сообщить, включен ли у пользователя javascript, и если нет, то они перенаправляют пользователя.
Мне было интересно, можете ли вы использовать respons_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.
Вы можете использовать либо то, либо другое для реализации какой-то изящной градации.
НО Вы не сможете использовать xhr?
для изящной градации, если только ваши вызовы ajax не устанавливают этот заголовок (Prototype делает это автоматически).
Более того, respond_to
обеспечивает большую гибкость, т.е.отправка xml, json, js, чего бы это ни было, из одного и того же блока.
Так что я бы порекомендовал respond_to
вот.