ruby-on-rails - 在 RoR 2.x 中使用 respond_to 通过 ajax 实现优雅降级

标签 ruby-on-rails ruby ajax graceful-degradation

我正在阅读关于使用 ruby​​ on rails 进行 Web 开发的 AWDR 一书,旧代码的一个问题是它没有使用 respond_to 来确保所使用的 View 是 javascript View 。现在在一些更新的示例中,我看到人们后来提到他们,在实现优雅降级时,使用 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 header (查看它是否包含“XMLHttpRequest”)。 respond_to 查看接受的 mime 类型。

您可以使用其中任何一种来实现某种优雅的降级。

但是您将无法使用xhr? 进行优雅降级,除非您的ajax 调用正在设置该 header (Prototype 会自动执行此操作)。

此外,respond_to 提供了更大的灵 active ,即发送 xml、json、js,无论它来自同一个 block 。

所以我建议在这里使用 respond_to

关于ruby-on-rails - 在 RoR 2.x 中使用 respond_to 通过 ajax 实现优雅降级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149776/

相关文章:

javascript - 如何使 Javascript 生成的复选框持久化?

ruby - 从字符串中删除所有特殊字符 - ruby

jquery - 从HTTP获取数据

mysql - 将两列的值提取到单个哈希变量中

ruby-on-rails - Rails Devise 注册表单未定义方法 `devise_error_messages!'

ruby-on-rails - rails : link_to into another controller with params

javascript - Ajax调用-12019错误

ruby-on-rails - 不测试公共(public)方法

ruby - 在 Ruby 中,getoptlong 破坏性地解析 ARGV。有没有解决的办法?

jquery - 回到使用 ajax 的 PushState 条目