首页 > 解决方案 > Rails:在 1 个动作中多次更新视图

问题描述

我正在开发一个 Ruby on Rails (5.2) 项目。我对细节有点含糊,因为我正在寻找更多的理论答案,或者关于如何解决这个问题的建议,而不是具体的解决方案。在这个项目中,我有一个按钮可以启动控制器操作。在同一视图中还有一个字段显示我要修改的“状态”。

理想情况下,一旦单击按钮,就会调用下面的控制器操作。(假设执行的代码需要时间(~10 秒)并且不能放在后台作业中。)在函数执行的不同点,我想修改视图中的 DOM 元素。

class x_Controller < ApplicationController
    def function_x
        ...
        # execute some code
        ...
        ( call JS function here w/ msg = 'step 1')
        ...
        # execute some code
        ...
        ( call JS function here w/ msg = 'step 2')
        ...
        # execute some code
        ...
        ( call JS function here w/ msg = 'step 3')
    end
end

我要调用的 JS 函数只是修改了一个 DOM 元素。

function start_loading_bar(msg) {
  $('.progress-message').text(msg + "...")
  $('#progress').fadeIn()
}

从用户的角度来看,一旦点击按钮,底部就会弹出一个状态栏。在执行的不同点,状态栏显示的消息将从“第 1 步”变为“第 2 步”到“第 3 步”,而无需用户进行任何额外输入。

我已经尝试了多种方法来解决这个问题。

最初我只是将函数绑定到按钮的 onclick,但是,这个方法不允许我在之后修改它,因为 onclick 只是在开始时触发一次。

接下来,我尝试制作一个包含我想要修改的 DOM 元素的部分,并在控制器操作中使用不同的参数呈现它。但是,您不能在单个操作中拥有多个 redirect_to / render 并且我遇到了错误。

我想知道这是否有可能做到?我是否正确地解决了这个问题?我是否忽略了更好的实现?

标签: javascriptruby-on-railsrubyajax

解决方案


看看行动电缆。它允许您向用户广播函数执行状态。并将提到的功能放入后台作业(它允许您发送消息)。

此外,在进行生产时,请考虑改用AnyCable


推荐阅读