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

Javascript 在Rails应用程序中单击链接后显示消息,即使方法的执行尚未完成,javascript,ruby-on-rails,redmine,redmine-plugins,Javascript,Ruby On Rails,Redmine,Redmine Plugins,很抱歉,我不知道如何简单地解释我的问题 我为Redmine平台创建了一个插件,用户可以将他的Dropbox帐户与Redmine上的documents选项卡同步,一切正常,但我有一个小问题 当用户点击synchronize链接时,我想在我的视图中显示一条小消息,通知他工作已经开始。此外,如果出现一个小弹出窗口,让用户选择他是否真的想进行同步,这将是非常好的,因为这可能需要一段时间 我尝试了几件事: 首先,我像这样写了我的链接到: <%= link_to 'Synchronise', {:co

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

我为Redmine平台创建了一个插件,用户可以将他的Dropbox帐户与Redmine上的documents选项卡同步,一切正常,但我有一个小问题

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

我尝试了几件事:

首先,我像这样写了我的
链接到

<%= 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" %>
<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :onclick => "displayMessage()" %>
 <% flash.each do |name, msg| -%>
  <%= content_tag :div, msg, class: name %>
 <% end -%>
“projectusers”、:action=>“dropbox_sync”、:id=>p、:project_id=>@project.identifier}、:class=>“图标图标重新加载”、:confirm=>“您确定要..bla bla”%>
这很好,但我不知道如何在用户接受同步后直接在我的视图中显示消息,有没有办法做到这一点

第二,我使用了一些Javascript。在我的观点开始时,我写了这样一个小脚本:

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

函数displayMessage()
{
警报(“同步即将启动blabla”);
$('#syncStarted').show();
}
然后是一个隐藏的段落:

<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", :confirm => "Are you sure you want to .. bla bla" %>
<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :onclick => "displayMessage()" %>
 <% flash.each do |name, msg| -%>
  <%= content_tag :div, msg, class: name %>
 <% end -%>
“projectusers”、:action=>“dropbox\u sync”、:id=>p、:project\u id=>@project.identifier}、:class=>“图标重新加载”、:onclick=>“displayMessage()”%>
我知道这不是一个很好的Ruby/Rails实现JS的方法,我的html已经过时了(CSS会更好),但它工作得很好。唯一的问题是,用户没有选择,如果他点击链接,即使他通过点击十字关闭弹出窗口,同步也会开始

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

我正在使用Rails v3.2.16


谢谢

有很多解决方案可供选择。请尝试下一个:

检查您的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>
添加一个名为dropbox_sync.js.erb的视图文件,该文件仅包含字符串:

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

同步后是否重定向到其他视图?然后只需使用内置闪光灯即可。 在重定向上,请执行以下操作:

 redirect_to after_sync_url, notice: "Sync has started."
在后视图中放置类似于以下内容:

<%= 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" %>
<%= link_to 'Synchronise', {:controller => "projectusers", :action => "dropbox_sync", :id => p, :project_id => @project.identifier}, :class => "icon icon-reload", :onclick => "displayMessage()" %>
 <% flash.each do |name, msg| -%>
  <%= content_tag :div, msg, class: name %>
 <% end -%>

如果您想显示进度条或加载程序,指示同步正在后台运行,则必须执行Anton建议的操作。
由于我认为同步需要很多时间,我建议使用加载程序并在后台运行同步。

确认后,会出现一个带有加载徽标的小弹出窗口,这很好,但用于通知用户的
闪存(写在我的控制器中)同步后不再显示。此外,隐藏段落在任何时候都不会显示,知道为什么吗?显示整个dropbox\u同步操作。Flash使用会话,因此在页面重新加载后将显示Flash消息。我假设您没有页面重新加载,并通过ajax进行同步。我不使用ajax,即同步(从Dropbox上传文件)是通过我使用
net/HTTP
库编写的HTTP请求进行的,然后在操作结束时,我有一个
重定向到:action=>“索引“
使用某些flash如果您不使用ajax,则同步时无法显示消息。当用户单击链接时,页面在确认后会重新加载/重定向。在这种情况下,您可以在页面上添加包含flash消息的块,并在新页面完全加载时将其隐藏“一旦用户在页面上,即使他没有启动同步,消息也将被显示”如果同步已被处理,则应将消息放入flash,如果您有任何flash消息,则应显示带有消息的阻止。否则,只需不显示该阻止:)不,我正在重定向同一页面上的用户。我并不真的想要一个进度条或类似的东西,只是一个同步已开始的小通知。但是,如何进行同步?在后台的单独任务中,或在单击您发布的链接时调用的操作中?如果在同步后仅重定向回ind例如,您可以使用我上面发布的代码显示您的flash。我通过单击链接进行同步,它不会在后台运行,用户最多只需等待五分钟,具体取决于其Dropbox的内容。我可以在用户重定向时成功显示消息,但不仅仅是在他单击链接后。