【发布时间】:2017-09-14 15:43:03
【问题描述】:
我有一个控制器操作,我想在其中接收表单数据、执行一些业务逻辑,然后刷新表单。如果我将对象保存在数据库中然后使用redirect_to,这可以正常工作。我希望控制器在内存中编辑对象并直接呈现响应。
例如,以标准 rails 5.1.4 生成的应用程序为例:
rails new turbolinks_example
rails g scaffold Thing name
rails db:migrate
为了简洁和启用 turbolink,对表单进行了略微编辑:
<%= 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) 现在我们编辑控制器以更改对象。这使用重定向进行编辑和工作:
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) - 控制器收到更新请求 - 对象被修改(并保存) - 返回重定向 - 重定向的 url 被呈现 - DOM 已更新 与 B) - 控制器收到更新请求 - 对象被修改(在内存中) - 呈现响应 - 浏览器收到响应,但被忽略
收到的响应看起来是正确的。完整的 HTML,包含对对象所做的更改。如何让 turbolinks 注意到它并像往常一样替换 document.body?
完整的项目,包括 development.log 是on Github
【问题讨论】:
标签: ruby-on-rails-5 turbolinks-5