在重定向之前,Rails在当前视图中闪烁通知

时间:2016-08-04 21:06:33

标签: ruby-on-rails

当用户提交表单时,我需要在“新”视图中刷新消息,但是,在控制器重定向到“显示”视图之前,

我在提交表单时从create方法运行.sh脚本。该脚本需要几分钟才能运行。表单位于“新”视图内。表格等等都是脚手架,所以使用标准惯例。

如何在.sh脚本运行且控制器重定向之前在“新”视图中刷新消息?

new.html.erb:

<p id="notice"><%= notice %></p>
<h1>New Job</h1>
<%= render 'form' %>

jobs_controller:

  def create
    @job = Job.new(job_params)

    flash[:notice] = 'Job Started' #added notice here but it doesn't flash in the "new" view

    respond_to do |format|
      if @job.save
        format.html { redirect_to @job, notice: 'Job finished' }
        format.json { render :show, status: :created, location: @job }
      else
        format.html { render :new }
        format.json { render json: @job.errors, status: :unprocessable_entity }
      end
    end

    job_call = 'sh testScript.sh' #var for a test sh file to run 
    system(job_call) #add sh script here

  end

2 个答案:

答案 0 :(得分:1)

Flash消息不会发生,因为只有在Rails将响应发送回客户端(浏览器)并且浏览器呈现模板时才会发生。

只有在create方法中的所有内容都完成后,才会发回响应。这是你问题的症结所在。

阻止程序是在Rails中你只能对每个控制器方法进行一次重定向或渲染,即使你试图欺骗并调用另一个包含第二个渲染或重定向的方法。你得到一个AbstractController::DoubleRenderError

我认为没有办法解决这个问题,我认为你甚至无法用Rails AJAX实现它。看起来你的Javascript解决方案是唯一的方法。为什么不提交解决方案?

答案 1 :(得分:1)

因此,这显然是解决问题的方法。但我实现了它,取消隐藏div或只是闪烁一个JS警报,并在表单提交上显示通知消息:

<%= f.submit 'Run Job', :onclick => "return showNotice()"%>