Rails控制器:检查是否为Turbolinks请求

7

我正在开发一个使用Turbolinks gem的Ruby on Rails 4应用程序。当单击链接时,我注意到布局仍然在服务器端呈现,但是Turbolinks JavaScript只是从呈现内容中获取了body。我的问题是,在控制器端是否可能确定请求是通过Turbolinks进行的。在Turbolinks进行请求时,如果需要设置布局为false,以避免执行不必要的代码。在我的ApplicationController中,我已经有以下代码:

# Don't use layout when AJAX request
layout proc { |controller| controller.request.xhr? ? false: "application" }

这段代码可以防止通过jQuery进行的AJAX请求呈现标题,但是当使用Turbolinks时似乎没有任何作用。

不使用布局渲染是否会破坏Turbolinks进程? Turbolinks将(引用):“保持当前页面实例处于活动状态,并仅替换头部中的正文和标题”。因此,看起来Turbolinks依赖于发送完整页面布局。 - zwippie
2个回答

2
对于 Turbo(Turbolinks 的后代),我找到的唯一解决方案是检查 formats.any?(:turbo_stream)。这是因为 Turbo 插入了一个 "turbo-stream" 接受头。
除非您使用 Frames,否则还将有一个 "Turbo-Frame" 头。
它还插入了一个 CSRF 令牌,但我认为这并不能保证请求来自 Turbo。

0

虽然这有点像是一个hack,但我发现检查“X-XHR-Referer”头似乎可以解决问题。

unless request.headers["X-XHR-Referer"].present? 
    do_some_stuff
end

看起来Turbolinks添加了一些重定向处理的头部。不过这可能会在未来发生变化。


前段时间,我实现了自己的改良版Turbolinks来实现这个功能,但是发现有时在浏览器中使用后退按钮时,页面会呈现出没有body的情况,看起来很糟糕。我很快就决定放弃这个尝试,转而使用PJAX或标准AJAX来满足我的需求。但还是感谢你的分享。 - user1331999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接