当用户提交表单时,我需要在“新”视图中刷新消息,但是,在控制器重定向到“显示”视图之前,。
我在提交表单时从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
答案 0 :(得分:1)
Flash消息不会发生,因为只有在Rails将响应发送回客户端(浏览器)并且浏览器呈现模板时才会发生。
只有在create
方法中的所有内容都完成后,才会发回响应。这是你问题的症结所在。
阻止程序是在Rails中你只能对每个控制器方法进行一次重定向或渲染,即使你试图欺骗并调用另一个包含第二个渲染或重定向的方法。你得到一个AbstractController::DoubleRenderError
。
我认为没有办法解决这个问题,我认为你甚至无法用Rails AJAX实现它。看起来你的Javascript解决方案是唯一的方法。为什么不提交解决方案?
答案 1 :(得分:1)
因此,这显然是解决问题的方法。但我实现了它,取消隐藏div或只是闪烁一个JS警报,并在表单提交上显示通知消息:
<%= f.submit 'Run Job', :onclick => "return showNotice()"%>