Использование respons_to для постепенного ухудшения с помощью ajax в RoR 2.x

StackOverflow https://stackoverflow.com/questions/149776

Вопрос

Я просматривал книгу 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 вот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top