ruby-on-rails 轨道控制器检查是否有Turbolink请求

waxmsbnn  于 2023-01-14  发布在  Ruby
关注(0)|答案(2)|浏览(164)

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

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

如果我通过jQuery发出AJAX请求,这段代码会阻止 AJAX 请求呈现标头,但是在使用Turbolinks时,它似乎没有做任何事情。

gwo2fgha

gwo2fgha1#

虽然这有点像黑客,但我发现检查标题中的“X-XHR-Referer”似乎可以达到这个目的。

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

看起来turbolink添加了一些重定向处理的头。虽然这在未来可能会改变。

uqjltbpv

uqjltbpv2#

对于Turbo(Turbolinks的后代),我找到的唯一解决方案是检查formats.any?(:turbo_stream),这是因为Turbo插入了一个“turbo-stream”接受头。
除非你使用的是框架,否则也会有一个“涡轮框架”头。
它还插入一个CSRF令牌,但我不认为这是任何保证,该请求是从涡轮。

相关问题