Redirect_to:返回:在特定情况下警报未按预期工作

时间:2016-12-07 18:27:47

标签: ruby-on-rails ruby

我有一个form_tag的页面,用于确定生成纯文本文件的参数:

<%= form_tag(remessa_individual_boletos_path, :method => "get",  :target => "_blank", :class => "form_change_action", :id => "form-remessa") do %>
...

提交表单后,需要检查一些内容,如果出现问题,我必须通知用户。在系统的其余部分完成此操作的方法是重定向并在警报中显示消息:

redirect_to :back, alert: "É necessário definir o limite de remessas por dia da conta bancária."

实际生成和下载文件的代码行是send_data

send_data @geraboleto.geraremessaboletoindividual(params[:banco_id], current_user.id), :content_type => 'text/plain', :filename => @geraboleto.filename

然而,当实际上出现错误时,:target => "_blank"不会简单地刷新页面并显示警告,而是打开一个新的选项卡,其中包含与表单所在页面相同的URL,因此用户最终在同一地址中有两个选项卡,但警报显示在原始选项卡上,此时此处不可见,因为新选项卡位于屏幕上,这意味着用户可能看不到警报而不理解原因他们的文件没有生成。

当我删除:target => "_blank"并提交表单时,如果出现错误,则会发生预期的行为:页面刷新并显示警报。但是,当没有错误发生时,文件生成但没有下载(没有提示保存或打开文件),所以我假设我需要这段代码......

总结一下:我需要能够通过send_data下载文件,我认为我需要:target => "_blank",但我还需要能够向用户显示提醒当发生错误时,:target => "_blank"似乎是一个问题。我怎样才能使这两种情况起作用?

1 个答案:

答案 0 :(得分:0)

无需添加"_blank"目标来下载文件,只需让控制器操作中的send_data

# your/view.html.erb

<%= form_tag(remessa_individual_boletos_path, :method => "get", ...) do %>
# ...

# YourController

def action
  if valid?
    send_data ...
  else
    redirect_to :back, alert: 'Alert message'
  end
end