gpt4 book ai didi

ruby-on-rails-5 - 如何使用 Rails 5 将回复呈现给 Turbolinks 5

转载 作者:行者123 更新时间:2023-12-02 01:26:23 24 4
gpt4 key购买 nike

我有一个 Controller 操作,我想在其中接收表单数据,执行一些业务逻辑,然后刷新表单。如果我将对象保存在数据库中然后使用redirect_to,则效果很好。我希望 Controller 编辑内存中的对象并直接渲染响应。

例如,采用标准 Rails 5.1.4 生成的应用程序,如下所示:

rails new turbolinks_example
rails g scaffold Thing name
rails db:migrate

为了简洁并启用涡轮链接,对表单进行了稍微编辑:

<%= form_with(model: thing) do |form| %>
<div class="field">
<%= form.label :name %>
<%= form.text_field :name, id: :thing_name %>
</div>

<div class="actions">
<%= form.submit %>
</div>
<% end %>

A) 现在我们编辑 Controller 来更改对象。这使用重定向来编辑和工作:

ThingsController < ApplicationController
...
def update
if @thing.update(thing_params)
@thing.update name: "#{@thing.name} is OK"
redirect_to edit_thing_path(@thing)
end
end

B)这使用渲染并且不起作用:

class ThingsController < ApplicationController
...
def update
if @thing.update(thing_params)
@thing.name = "#{@thing.name} is OK"
render :edit
end
end
end

与A) - Controller 收到更新请求 - 对象被修改(并保存) - 返回重定向 - 呈现重定向的网址 - DOM 已更新与 B) - Controller 收到更新请求 - 对象被修改(在内存中) - 响应已呈现 - 浏览器收到响应,但被忽略

收到的回复看起来正确。完整的 HTML,以及对对象所做的更改。如何让 Turbolinks 注意到它并像平常一样替换 document.body?

完整的项目,包括development.log是on Github

最佳答案

问题是,在 Rails 5 中:

  • 默认情况下,表单是远程的:它们通过 AJAX 发送,除非提供了 local: true
  • 当渲染 HTML 作为对 AJAX 调用的响应时,不会发生任何事情,除非客户端中有自定义 JavaScript 来处理响应
  • Turbolinks 默认启用,它可以正确处理 redirect_to,但对 render 不执行任何操作

我认为这是 Rails 中的一个不一致之处,会导致很多困惑,例如您在代码中暴露的问题。我创建了一个gem turbolinks_render来处理这个问题。我也wrote a little post on this very same problem .

我希望,无论怎样,这个问题能够在未来的 Rails 版本中得到修复。

关于ruby-on-rails-5 - 如何使用 Rails 5 将回复呈现给 Turbolinks 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46223355/

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