gpt4 book ai didi

ruby-on-rails - 即使 format.js 不在 Controller 上,Rails 也会响应 Javascript 请求

转载 作者:行者123 更新时间:2023-12-04 06:19:57 25 4
gpt4 key购买 nike

在标准的脚手架 Rails 5.1(或 5.0) Controller 中,您可以在创建操作中获得:

def create
@test = Test.new(test_params)

respond_to do |format|
if @test.save
format.html { redirect_to @test, notice: 'Test was successfully created.' }
format.json { render :show, status: :created, location: @test }
else
format.html { render :new }
format.json { render json: @test.errors, status: :unprocessable_entity }
end
end
end

如您所见,那里没有format.js

但是如果您将 remote: true 添加到表单中(或者,在 Rails 5.1 中,您删除 local: true 它将使用新的默认值,即发布通过 ajax),表单有效:浏览器将通过 xhr 发送帖子并重定向到新创建的记录。

查看开发工具,我看到表单提交的响应是 200 OK,内容如下:

Turbolinks.clearCache()
Turbolinks.visit("http://localhost:3000/tests/10", {"action":"replace"})

控制台还表明它是由 Javascript 处理的:
在 2017-06-18 09:38:25 -0300 开始为 127.0.0.1 发布“/tests”
由 TestsController 处理#create as JS

那么问题是:如果 Controller 中没有 format.js,Rails 如何处理 JS 请求的响应/重定向?

我完全喜欢 Rails 的魔力,但我想知道它是如何工作的,而且我还没有在任何地方看到关于“将 JS 请求回退到 format.html block ”的记录。

最佳答案

看起来生成该响应的代码来自 turbolinks-rails gem。

https://github.com/turbolinks/turbolinks-rails/blob/v5.0.1/lib/turbolinks/redirection.rb#L14

从链接的代码来看,当 redirect_to 被调用时,turbolinks 准备了一个 js 响应,请求是 XHR,而不是 GET 请求,并且 turbolinks:false 未提供给 redirect_to 调用。

当 gem 存在且 app.config.turbolinks.auto_include 为真时,Turbolinks 会覆盖 ActionController redirect_to

def redirect_to(url = {}, options = {})
turbolinks = options.delete(:turbolinks)

super.tap do
if turbolinks != false && request.xhr? && !request.get?
visit_location_with_turbolinks(location, turbolinks)
else
if request.headers["Turbolinks-Referrer"]
store_turbolinks_location_in_session(location)
end
end
end
end

关于ruby-on-rails - 即使 format.js 不在 Controller 上,Rails 也会响应 Javascript 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44615066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com