【问题标题】:How do I render a reply into turbolinks 5 with rails 5如何使用 rails 5 将回复渲染到 turbolinks 5
【发布时间】: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


    【解决方案1】:

    问题在于,在 Rails 5 中:

    • 默认情况下表单是远程的:除非提供local: true,否则它们通过 AJAX 发送
    • 当呈现 HTML 作为对 AJAX 调用的响应时,什么都不会发生,当然,除非客户端中有自定义 javascript 来处理响应
    • 默认启用Turbolinks,它可以正确处理redirect_to,但对render没有任何作用

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

    我希望在未来的 Rails 版本中可以通过某种方式解决这个问题。

    【讨论】:

    • 我安装了你的 gem,希望它能让我的表单提交。但是表单仍然没有提交。该表单仅在给带有表单的页面的 link_to 提供 data: { turbolinks: false } 时才有效。理想情况下,我想保持 turbolinks 开启。你的宝石能解决这个问题吗?有很多关于由于 turbolinks 导致表单未提交的帖子(对我来说,解决这个问题的唯一成功方法是关闭 turbolinks)
    • 您的代码可能有问题。 “表单未提交”是什么意思?您需要在 application.js 中使用 //=require rails-ujs 来制作远程工作表单(对于 Rails >= 5.1),或者在以前的版本中使用 jquery-ujs。也许您错过了这一点,因此远程表单无法正常工作。如果您可以分享一些代码,我可以尝试提供帮助。
    • 我尝试将 //=require rails-ujs 添加到 application.js 但它没有改变任何东西(表单仍然不起作用)。 here 还有很多其他人遇到类似问题。我找到了使用 carlosveucv 提供的答案的解决方法,但我相信这只是关闭涡轮链接而不是解决导致问题的任何原因。我同意 Rails 需要解决这个问题。但如果这没有发生,那么制作一个可以做的宝石可能是一个很好的临时解决方案
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2016-12-03
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多