在Rails应用程序中单击链接后显示消息,即使该方法的执行尚未完成

Display message after clicking a link in Rails application even if the execution of the method is not finished

本文关键字:方法 未完成 执行 消息 应用程序 Rails 单击 链接 显示      更新时间:2023-09-26

很抱歉问题的提法,我真的不知道如何简单地解释我的问题。

我为Redmine平台创建了一个插件,用户可以在Redmine的文档选项卡上同步他的Dropbox帐户,一切都很好,但我有一个小问题。

当用户单击synchronise链接时,我想在我的视图中显示一条小消息,通知他工作已经开始。此外,如果出现一个小的弹出窗口让用户选择他是否真的想进行同步,那就太好了,因为这可能需要一段时间。

我尝试了一些事情:

首先,我这样写我的link_to:

<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :confirm => "Are you sure you want to .. bla bla" %>

这很好,但我不知道如何在用户接受同步后直接在我的视图中显示消息,有办法做到这一点吗?

第二个,我使用了一些Javascript。我在视图的开头写了这样一个小脚本:

<script>
function displayMessage()
{
  alert("Sync is about to start blabla);
  $('#syncStarted').show(); 
}
</script>

然后是一个小的隐藏段落:

<p id="syncStarted", style="display:none"><strong><font color="green">Synchronisation has started, please wait...</font></strong></p>

我这样调用我的函数:

<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :onclick => "displayMessage()" %>

我知道这不是一个很好的Ruby/Rails实现JS的方式,我的html相当过时(CSS会更好),但它工作得很好。唯一的问题是,用户没有选择,如果他点击链接,同步将开始,即使他关闭弹出窗口点击交叉。

也许你能帮我找到更好的方法来做到这一点,我认为使用:confirm参数更好,但我找不到如何在用户确认动作后在我的页面上添加一个小通知。

我正在使用Rails v3.2.16.

谢谢

是否在同步后重定向到另一个视图?然后只需使用内置闪光灯。重定向:

 redirect_to after_sync_url, notice: "Sync has started."

在视图后的位置像这样:

 <% flash.each do |name, msg| -%>
  <%= content_tag :div, msg, class: name %>
 <% end -%>

如果你想要显示进度条或加载程序,表明同步正在后台运行,你必须像Anton建议的那样做。因为我认为同步需要很多时间,我建议使用加载器并在后台运行同步。

有很多解决方案。试试下一个:

检查你的application.js是否在布局中加载并且包含:

//= require jquery
//= require jquery_ujs

在视图中:

<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :remote => true, :confirm => "Are you sure you want to .. bla bla" %>
<p id="syncStarted" style="display:none"><strong><font color="green">Synchronisation has started, please wait...</font></strong></p>

in projectusers controller:

def dropbox_sync
  ... # action logic
  respond_to :js
end

添加一个名为dropbox_sync.js的视图文件。只有字符串的动词:

$('#syncStarted').show();