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

时间:2014-05-02 07:13:46

标签: javascript ruby-on-rails redmine redmine-plugins

对不起问题的提法,我真的不知道如何解释我的问题。

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

当用户点击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。

由于

2 个答案:

答案 0 :(得分:1)

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

 redirect_to after_sync_url, notice: "Sync has started."

在放置这样的东西之后的视图中:

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

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

答案 1 :(得分:0)

有很多解决方案如何制作它。试试下一个:

检查你的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>

在projectusers控制器中:

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

添加一个名为dropbox_sync.js.erb的视图文件,其中只包含字符串:

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